iOS:使用自我和下划线(_)与variables

可能重复:
如何在cocoaObjective-C类中的variables前面的下划线工作?

使用自variables或带有variables名称的下划线后,我很困惑,如下所示:

In .h file: @property(nonatomic, strong) NSMutableArray *users; In .m file: @synthesize users = _users; 

根据我对使用self.users的理解,操作系统将确保在set方法中释放之前分配的内存,所以我们不需要明确地注意。

_users是用户的一个实例variables,通常在访问usersvariables时使用。 如果我使用_users来更改它的值,那么它将不会触发KVO委托,这将不会通知观察用户值更改的类。

而且,self.users允许在下面的方法名称中区分虚拟variables,

 - (void)assignUsers:(NSMutableArray*)users { self.users = users; } 

有人可以告诉我,在使用_users或self.users的时候是否有任何理解错误或遗漏的东西。 谢谢。

我认为有助于考虑编译器如何实现(或可能)属性。

当你写self.users = array; 编译器将其转换为[self setUsers:array]; 当你写array = self.users; 编译器将其转换为array = [self users];

@synthesize在你的对象中添加一个ivar( 除非你自己添加了它 ),并为你实现了-users-setUsers: accessor方法( 除非你自己提供

如果你使用ARC-setUsers:看起来像这样:

 - (void)setUsers:(NSArray *)users { _users = users; // ARC takes care of retaining and release the _users ivar } 

如果您使用MRC (即ARC未启用),- -setUsers:将看起来像*:

 - (void)setUsers:(NSArray *)users { [users retain]; [_users release]; _users = users; } 

* – 请注意,这是-setUsers:一个简化的非primefaces实现-setUsers:

当你使用self.users ,你通过setter或者getter来访问这个属性。

当你使用_users ,你可以直接跳过setter或getter来访问属性。


这是一个很好的示范:

 - (void)setUsers:(id)users { self.users = users; // WRONG : it causes infinite loop (and crash), because inside the setter you are trying to reach the property via setter } 

 - (void)setUsers:(id)users { _users = users; // GOOD : set your property correctly } 

这也是getter的情况。


关于基本内存pipe理(如果是MRRARC ): 如果没有更强的指针保持活动状态则iOS将释放对象,无论您如何释放对象的指针。

是的,这是非常正确的。 几个小点:

iOS不会因为使用点符号而自动释放对象。 当该属性被声明为copyretain (或在ARC中strong )时,它释放一个对象。 例如,如果您正在使用非ARC代码,并且该属性被声明为assign ,则不会释放该对象。

使用最新版本的开发工具链(Xcode 4.4+),您不再需要手动合成属性 – 它们会自动合成(使用前导下划线)。