【发布时间】:2013-04-03 14:49:30
【问题描述】:
在线程“我如何管理内存”中,作者说“我不会在 init 和 dealloc 中使用完整的形式,因为它可能会触发 KVO 或有其他副作用。” 我没明白你的意思?
【问题讨论】:
-
我认为您正在从不同来源对 obj-c 进行一些研究... :)
标签: objective-c memory-management
在线程“我如何管理内存”中,作者说“我不会在 init 和 dealloc 中使用完整的形式,因为它可能会触发 KVO 或有其他副作用。” 我没明白你的意思?
【问题讨论】:
标签: objective-c memory-management
我认为作者应该更加小心命名约定。
@property (nonatomic, retain) NSString *something;
应该综合到
@synthesize something = _something;
这样您可以参考self.something 来使用访问器方法或_something 来使用支持该属性的ivar。它更不容易出错。
关于你的问题。当您拥有访问器时,除了在该访问器方法中设置该属性(例如通知另一个对象或更新 UI)之外,您可能还在做其他事情。而且您可能不想在 init 或 dealloc 上执行此操作。这就是您可能希望直接访问 ivar 的原因,但情况并非总是如此。
【讨论】:
他指的是通过自我符号访问您的@properties。合成属性时,会自动为您创建该变量的 getter 和 setter:
@property (nonatomic,strong) MyClass myVar;
@synthesize myVar = _myVar;
- (MyVar *)myVar
{
return _myVar;
}
- (void)setMyVar:(MyClass *)myVar
{
_myVar = myVar;
}
这些方法是在定义和/或合成属性时在后台创建的(取决于 Xcode 版本)
所以当你这样做时
self.myVar = 5;
你实际上在做[self setMyVar:5];
但是,可以使用以下符号直接访问变量并绕过设置器
_myVar = 5;
例子:
@property (nonatomic,strong) MyClass myVar;
@synthesize myVar = _myVar;
- (void)someMethod
{
// All do the same thing
self.myVar = 5;
[self setMyVar:5];
_myVar = 5;
}
本文作者建议不要在 dealloc 和 init 方法中使用 getter 和 setter,而是使用 _myVar 表示法直接访问变量。
有关最佳实践等的更多信息,请参阅此答案,但这是一个有争议的问题:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?
【讨论】: