@interface someClass : UIViewController
{
NSString *name;
}
@property (nonatomic, copy) NSString *name;
@end
这样做您将显式声明一个属性和一个 ivar。
属性只是一组方法:
- (void)setName:(NSString*)name;
- (NSString*)name;
ivar 是保存属性方法管理的值的内存存储。这允许您执行以下操作:
self.name = ... // access through setter method
name = ... // direct access
使用属性的优点是它们为您处理内存管理。例如,在您的情况下,属性是 type copy
:这意味着使用第一个语法 ( self.name = ...
) 将完成对象的副本。如果不使用属性,您将明确需要做:name = [originalString copy];
以获得相同的效果。
您可以为属性(但不是 ivars)指定的其他选项是:strong
和weak
所有权。
此外,属性还表示从类外部访问变量的公共接口。
使用直接访问您可以自行管理内存(如果您不使用 ARC)。如果您使用 ARC 并且不定义属性,您将无法通过指定所有权来控制内存的管理方式:强、弱、保留)。
@interface someClass : UIViewController
{
}
@property (nonatomic, copy) NSString *name;
@end
这里你只声明属性;ivar 由@synthesize
您的实现文件中的指令“推断”。这仅在 Objective C 2.0 及更高版本中是可能的(以前,上面的 ivar 声明是强制性的)。
与上述相同的注意事项适用,但有细微差别:使用旧版本的 LLVM(ObjC 编译器)您将无法直接引用自动合成的 ivar;对于当前版本的 LLVM,如果您省略该@synthesize
指令,那么还将声明一个以您的属性命名的自动 ivar(在您的情况下为_name
)。
最后一段可能看起来有点“高级”或做作,但您可以放心地忽略它。
@interface someClass : UIViewController
{
NSString *name;
}
@end
在这种情况下,您只是在声明 ivar。没有访问器方法。您将需要自己处理内存管理(如果不使用 ARC),而且您将无法从类外部访问该变量。为此,您需要访问器。
希望这可以帮助。