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理(如果是MRR
或ARC
): 如果没有更强的指针保持活动状态 , 则iOS将释放对象,无论您如何释放对象的指针。
是的,这是非常正确的。 几个小点:
iOS不会因为使用点符号而自动释放对象。 当该属性被声明为copy
或retain
(或在ARC中strong
)时,它释放一个对象。 例如,如果您正在使用非ARC代码,并且该属性被声明为assign
,则不会释放该对象。
使用最新版本的开发工具链(Xcode 4.4+),您不再需要手动合成属性 – 它们会自动合成(使用前导下划线)。