iOS:使用self和下划线(_)和变量

app*_*eak 10 memory-management objective-c self ios

可能重复:
cocoa objective-c类中变量前面的下划线如何工作?

在合成它之后,我一直很困惑使用自变量或带有变量名的下划线,如下所示:

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

In .m file:
@synthesize users = _users;
Run Code Online (Sandbox Code Playgroud)

基于我在使用self.users时的理解,操作系统将确保在set方法中释放以前分配的内存,因此我们不需要明确注意.

_users是用户的实例变量,通常在访问users变量时使用.如果我使用_users更改它的值,那么它将不会触发KVO委托,它不会通知观察用户值变化的类.

此外,self.users允许在方法名称中区分虚拟变量,如下所示,

- (void)assignUsers:(NSMutableArray*)users {
      self.users = users;
}
Run Code Online (Sandbox Code Playgroud)

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

hol*_*lex 31

当您使用时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
}
Run Code Online (Sandbox Code Playgroud)

- (void)setUsers:(id)users {
    _users = users; // GOOD : set your property correctly
}
Run Code Online (Sandbox Code Playgroud)

这也是吸气剂的关键所在.


关于基本内存管理(在MRR或的情况下ARC):如果没有更强的指针使其保持活动状态,iOS将解除对象的释放,无论你如何释放对象的指针.

  • 亲爱的**选民**!我很荣幸能得到一些反馈,说明为什么你的手在选民按钮之上摇晃,因为 - 你相信与否 - 我不是一个能够弄明白的人.谢谢! (3认同)

Nic*_*ell 8

我认为有必要考虑编译器如何(或可能)实现属性.

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

@synthesize为你的对象添加一个ivar(除非你自己添加),并为你实现-users-setUsers:访问器方法(除非你自己提供)

如果您使用的是ARC,-setUsers:则会看起来像:

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

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

- (void)setUsers:(NSArray *)users
{
    [users retain];
    [_users release];
    _users = users;
}
Run Code Online (Sandbox Code Playgroud)

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