2

在线程“我如何管理内存”中,作者说“我不会在 init 和 dealloc 中使用完整的形式,因为它可能会触发 KVO 或有其他副作用。” 我没明白你的意思?

来源在这里http://inessential.com/2010/06/28/how_i_manage_memory

4

2 回答 2

1

我认为作者应该更加小心命名约定。

@property (nonatomic, retain) NSString *something;

应该综合到

@synthesize something = _something;

这样,您可以参考self.something使用访问器方法或_something使用支持该属性的 ivar。它不太容易出错。

关于你的问题。当您拥有访问器时,除了在该访问器方法中设置该属性(例如通知另一个对象或更新 UI)之外,您可能还在做其他事情。而且您可能不想在 init 或 dealloc 上执行此操作。这就是为什么您可能希望直接访问 ivar,但情况并非总是如此。

于 2013-04-11T12:09:46.793 回答
0

他指的是通过自我表示法访问您的@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符号直接访问变量。

有关最佳实践等的更多信息,请参阅此答案,但这是一个有争议的问题:为什么我不应该在 init/dealloc 中使用 Objective C 2.0 访问器?

于 2013-04-11T12:08:39.863 回答