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

时间:2011-04-03 18:18:44

标签: iphone objective-c

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

@interface AddItemViewController : UITableViewController {

}

@property (nonatomic, retain) UITextField *itemName;

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

我通常这样做:

@interface AddItemViewController : UITableViewController {
  UITextField *itemName;
}

@property (nonatomic, retain) UITextField *itemName;

我先在@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

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

例如,如果我说NSString *myString - 我可以在@interface中声明它而不是@property但仍然可以访问它没问题,但是不会创建getter和setter。我也可以在两者中声明它。但是,如果我只是将其声明为@property,那该怎么办:

@interface AddItemViewController : UITableViewController {

}

@property (nonatomic, retain) NSString *myString;

注意我没有在@interface {}之间添加它 - 它有什么不同。

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

2 个答案:

答案 0 :(得分:8)

使用iPhone使用的“现代”运行时,编译器可以为您创建实例变量。只需使用:

@synthesize itemName;

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

@synthesize itemName=_itemName;

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

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

编辑:NVM,根据@bbum,我在脑海中想到的是,“32位”sim实际上是较旧的模拟器,它的行为与新的运行时不同。较新的模拟器仍然是32位,并支持此行为。见下面的评论。

更新

回答您的最新问题:

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

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

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

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

答案 1 :(得分:0)

这样做是完全可以接受的。但是,您需要自己实现setter / getter方法。这些不能使用@synthesize语法创建。

使用这种方法的一个原因可能是使属性基于比设置和获取值更复杂的属性。但是,对于简单的Nib连接而言,这并不像在您的示例中那样有意义。