app*_*eak 10 memory-management objective-c self ios
在合成它之后,我一直很困惑使用自变量或带有变量名的下划线,如下所示:
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将解除对象的释放,无论你如何释放对象的指针.
我认为有必要考虑编译器如何(或可能)实现属性.
编写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:
归档时间: |
|
查看次数: |
10451 次 |
最近记录: |