【问题标题】:the SET methods in iOS when I enable ARC启用 ARC 时 iOS 中的 SET 方法
【发布时间】:2013-08-02 02:11:05
【问题描述】:

如果没有 ARC,我会像这样编写 set 方法

- (void)setArr:(NSMutableArray *)arr
{
    _arr = [arr retain];
}

但启用 ARC 时 Xcode 告诉我“'retain' 不可用:在自动引用计数模式下不可用”。

【问题讨论】:

  • 只要_arr = arr;。为什么你还要像这样实现setter?让它合成就行了。
  • 这不是一个很好的二传手。如果您先设置一个值,然后设置另一个值,则在 ARC 之前,它会导致泄漏。
  • 如果你以这种方式在没有 ARC 的情况下制作你的 setter,你可能会有相当大的内存泄漏。
  • 谢谢提醒,忘记释放旧变量了,其实是在_arr = [arr retain];之前写了if(_arr){[arr release];}现在在 ARC 项目中是 _arr = arr;

标签: ios automatic-ref-counting


【解决方案1】:

_arr = arr; 是所有必要的。但实际上,根据您的代码示例,无需自己编写 setter。只需在头文件中声明 @property NSMutableArray *arr; 就足以让编译器生成 setter 和 getter。在启用 ARC 的情况下进行编译时,编译器会为您生成保留和释放调用。

【讨论】:

    【解决方案2】:

    在使用arc时,你所要做的就是让系统处理retain/release,这意味着:

    - (void)setArr:(NSMutableArray *)arr
    {
        _arr = arr;
    }
    

    但是,如果您的 setter 像这样简单,那么让编译器合成它就更容易了。

    以前您必须使用@synthesize,但现在将其声明为标题上的属性就足够了。

    @property (strong, nonatomic) NSMutableArray *arr;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多