【问题标题】:Why not use accessor methods in init and dealloc method? [duplicate]为什么不在 init 和 dealloc 方法中使用访问器方法? [复制]
【发布时间】:2013-04-03 14:49:30
【问题描述】:

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

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

【问题讨论】:

  • 我认为您正在从不同来源对 obj-c 进行一些研究... :)

标签: objective-c memory-management


【解决方案1】:

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

@property (nonatomic, retain) NSString *something;

应该综合到

@synthesize something = _something;

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

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

【讨论】:

    【解决方案2】:

    他指的是通过自我符号访问您的@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?

    【讨论】:

    • 这并没有解释 为什么 在 init/dealloc 中使用属性访问器可能会出现问题(这是 OP 所要求的)。
    • 不过这是一个主观问题,因此提供更多背景知识可能会有所帮助。
    猜你喜欢
    • 2010-11-19
    • 2011-03-26
    • 2012-05-17
    • 2011-04-11
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多