声明类属性/变量时,可以通过@property声明它吗?

xil*_*il3 4 iphone objective-c

我注意到一些生成的类只通过@property声明了类属性/变量,并且不在@interface中包含它们,因为:

@interface AddItemViewController : UITableViewController {

}

@property (nonatomic, retain) UITextField *itemName;
Run Code Online (Sandbox Code Playgroud)

我只是好奇,如果这是一种可接受的方式,或者如果这是出于不同的原因?

我通常这样做:

@interface AddItemViewController : UITableViewController {
  UITextField *itemName;
}

@property (nonatomic, retain) UITextField *itemName;
Run Code Online (Sandbox Code Playgroud)

我先在@interface中声明它,然后为它添加@property ......

*更新*

我只是想稍微更新一下,因为它对我来说仍然不是100%清楚.

我一直认为要声明一个@property,你首先需要先在@interface中声明它,然后我看到了这个:

@interface mInventoryAppDelegate : NSObject <UIApplicationDelegate> {

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end
Run Code Online (Sandbox Code Playgroud)

所有这些@property声明都只声明为@properties,而不是@interface.

例如,如果我不得不说NSString *myString-我可以宣布,在@interface而不是作为一个@property,仍然可以访问它没有问题,但getter和setter将不会创建.我也可以在两者中声明它.但是,如果我只是将其声明为@property,那会怎样呢?

@interface AddItemViewController : UITableViewController {

}

@property (nonatomic, retain) NSString *myString;
Run Code Online (Sandbox Code Playgroud)

请注意我是如何在@interface {}之间添加它的 - 它是如何区别的.

很抱歉重复,但我只是想改写这个,以便我能得到一个对我更有意义的答案.

Fir*_*eer 8

借助iPhone使用的"现代"运行时,编译器可以为您创建实例变量.只需使用:

@synthesize itemName;
Run Code Online (Sandbox Code Playgroud)

或者如果您愿意......

@synthesize itemName=_itemName;
Run Code Online (Sandbox Code Playgroud)

......在你的实施中.然后编译器将创建ivar'itemName'或'_itemName'.

这当然是针对一个特定实例变量的属性是简单的getter/setter的情况.

编辑:NVM,每个@bbum,我在脑海中想到的是"32位"sim实际上是旧的模拟器,它的行为与新的运行时不同.较新的模拟器仍然是32位,并支持此行为.请参阅下面的评论.

更新

回答您的更新问题:

类的"接口"是@end的所有内容.我认为你所谓的"接口"实际上只是{}中的实例变量.{}之间的内容是您的类的实例变量.整个@interface包括那些实例变量PLUS方法和{}和@end之间的@property声明.

所以我认为你真正要问的是你的@interface中是否有@property,并且@property只是一个简单的getter/setter对,那么你是否需要在@interface中声明一个"支持"实例变量,在{}内.

iPhone的答案是否定的.编译器(两者)可以为您创建该实例变量.

我希望能回答这个问题吗?

  • 只有一个模拟器; 32位模拟器.它现在可以工作,因为模拟器已经更新,其运行时的行为类似于iPhone上的运行时.没有64位模拟器. (2认同)