2012-10-21 35 views
0

在实现文件中,所有属性都被指定为私有。
那么,它们之间的区别:你的访问者属性和实例变量有什么区别?

  1. MyObj.m

@interface MyObj() 

@property (nonatomic, strong) NSString *name; 

@end 

@implementation MyObj 

@synthesize name = _name; 

// Some other codes to use "name" like self.name or _name 

@end 


2. MyObj.m


@implementation MyObj 
{ 
    NSString *_name; 
} 

// Some other codes to use _name 

@end 
+0

可能重复[属性与实例变量](http://stackoverflow.com/questions/719788/property-vs-instance-variable),以及约800个其他问题。看到边栏---> –

回答

3

在第一个例子为你创作

- (NSString *)name; 
- (void)setName:(NSString *)name; 

另请注意,在较新版本的Xcode中,隐含了@synthesize

在第二个例子中,您只需创建一个ivar。

除非您有特殊情况,否则使用访问器通常会更好,因为它为您在未来提供了更大的灵活性。

+0

与你的说法一致,“它给你未来更多的灵活性”。我想问另一个问题:如果我使用属性而不是伊娃,我应该什么时候使用self.name,什么时候应该使用_name? (假设我合成了name = _name) – Kevin

+1

就像编程中的大多数事情“取决于”。如果我重写访问器或init/dealloc方法,我倾向于只使用'_name'。所以只有我或者需要直接访问的地方不会导致递归循环或者我想确保我可以在不引起任何副作用的情况下获取/设置值的位置。 –

+0

你总是希望在init和dealloc中直接使用ivar(不是通过getter/setter方法),因为getters和setter可以被子类覆盖,这些覆盖可能会引入在init和dealloc时间不安全的行为。除了这两个地方之外,我倾向于使用getter/setter,除非我有一个非特定的原因。另一件值得一提的事情是,使用@property会让你确定KVC/KVO的行为,你不会只用一个伊娃。 – ipmcc

2

我建议你总是使用@property的所有班级的数据成员。它们内置了内存管理功能,因此您不必担心这一点。属性还为使用该类的对象添加语法糖。所以,如果有你的MyObj类的obj我只是做

obj.name = @"brianSan"; 

这将是完全一样的东西

[obj setName: @"brianSan"]; 

此外,访问内objname可以通过obj.name来完成,这是与[obj name];相同

当您必须访问对象的对象内的方法时,它变得更容易看obj.prop.subprop.subsubprop而不是[[[obj prop] suprop] subsubprop]

相关问题