你们之间有什么区别 a)
@interface SViewController : UITableViewController{
NSString *_name;
}
@property (nonatomic, retain) NSString *name;
@synthesize name = _name;
b)中
@interface SViewController : UITableViewController{
NSString *name;
}
@property (nonatomic, retain) NSString *name;
@synthesize name;
答案 0 :(得分:2)
跳过伊娃,然后获得财产声明。如果您需要私有成员和方法,请使用类扩展。
一个例子:
@interface MyObject : NSObject {
}
@property (nonatomic,retain) NSString *publicString;
-(void)publicMethod;
@end
和实施:
#import "MyObject.h"
@interface MyObject ()
@property (nonatomic,retain) NSString *internalString;
-(void)internalMethod;
@end
@implementation MyObject
@synthesize publicString;
@synthesize internalString;
-(void)publicMethod {}
-(void)internalMethod {}
@end
注意:没有声明ivar并且只有属性的一个缺点是Xcode4(< = 4.0.1)中的gdb在调试时不会显示该属性。在编写iOS代码时非常烦人,因为你还不能使用LLDB来调试iOS项目。
答案 1 :(得分:1)
我更喜欢a)选项,因为它可以防止您意外忘记释放或过度释放资源。您只需将您的变量作为self.name访问,并分配nil或autoreleased值(如果它是示例中的retain属性)。在这种情况下,如果您尝试将值分配给“name”而不使用“self”。你会收到一个错误。
答案 2 :(得分:0)
没有有效的区别。这一切都归结为变量命名约定。私有变量通常以下划线('_')为前缀,这有助于代码可读性。如果您正在与一个小组合作,那么每个人都必须同意相同的命名约定。只要你是一致的,你就没有“正确”的答案。
通常,变量的第一个字母是驼峰(例如firstWordLowerCase)。名称应该是示例中的名称。由于它是一个读写属性,我个人的偏好是不使用下划线。如果它已被声明为readonly,那么我会使用它。
最重要的是一致。
答案 3 :(得分:0)
每当局部变量与iVar同名时,方法A)避免以下警告。
“'对象'的本地声明隐藏 实例变量。“
答案 4 :(得分:0)
我再也不会使用实例变量,除非有时在调试时我可以查看一个值。其余的时间我只使用属性并通过合成属性时创建的访问器方法访问它们。
对于合成时称为“myVariable”的属性,自动获取getter和setter方法。 getter只是变量的名称,在本例中是“myVariable”,它可以像这样访问:
someOtherVariable = [self myVariable];
通过在变量名前加上单词“set”并大写变量的第一个字母来构造setter,这就是你必须使用camelCase创建变量的原因。此示例中的setter如下所示:
[self setMyVariable:someOtherVariable];
请注意,我使用Objective-C消息语法而不是点语法。我强烈推荐这个,因为它是Objective-C的一个基本部分,我发现它更加清晰。如果你坚持使用点语法,你的getter将如下所示:
someOtherVariable = self.myVariable;
你的二传手看起来像这样:
self.myVariable = someOtherVariable;