【问题标题】:What is the rule of thumb for using @property(copy) vs. @property(retain)?使用@property(copy) 与@property(retain) 的经验法则是什么?
【发布时间】:2011-08-18 23:24:49
【问题描述】:

我想知道在决定 ObjectiveC 中的给定属性是否应该是 retaincopy 时,您是否遵循经验法则?

你如何决定它应该是哪个?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    为了安全起见,通常您使用 copy 来处理具有可变变体的类,例如 NSStringNSArray、其他集合类等。要了解原因,请考虑此处发生的情况...

    从前

    @interface MyClass : NSObject
    @property (retain) NSString *happyString;
    - (void)rejoice;
    @end
    

    然后有一天,

    - (void)bigBadMethod {
        MyClass *myObject = [[[MyClass alloc] init] autorelease];
        NSMutableString *theString = [NSMutableString stringWithString:@"I'm happy!"];
        myObject.happyString = theString; // this is allowed because NSMutableString inherits from NSString
        [myObject rejoice]; // prints "I'm happy!"
    

    突然……

        [theString setString:@"BRAAAAIIINNNSSSSS"];
        [myObject rejoice]; // prints "BRAAAAIIINNNSSSSS"
    }
    

    你不会想要那样的,对吧?因此,如果您不想在不查看时发生变异,请使用@property (copy)

    【讨论】:

    • +1 如果你启用了僵尸,那么欢乐应该打印“BRAAAAIIINNNSSSSS”;)
    【解决方案2】:

    简而言之,assign vs retain vs copy 决定了合成访问器如何与 Objective-C 内存管理方案交互:

    • assign 是默认值,只是执行变量赋值
    • retain 指定应发送新值 - 在分配时保留并发送旧值释放
    • copy 指定应发送新值 - 分配时复制并发送旧值释放。

    请记住,retain 是在创建的对象上完成的(它会增加引用计数),而 copy 会创建一个新对象。那么,区别在于您是要向对象添加另一个保留还是创建一个全新的对象。

    【讨论】:

    • 虽然您在技术上是正确的,但 OP 是在询问 why 使用每个选项,而不是 what 选项。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多