【问题标题】:iphone @propertyiphone@属性
【发布时间】:2011-01-02 09:27:31
【问题描述】:

这两者有什么区别?

@property (nonatomic, retain)
@property (nonatomic, copy)

这样的其他类型是什么?

【问题讨论】:

    标签: iphone objective-c properties


    【解决方案1】:
    【解决方案2】:

    使用retain相当于这个方法:

    - (void)setMyObject:(id)object {
        myObject = [object retain];
    }
    

    使用copy是这样的:

    - (void)setMyObject:(id)object {
        myObject = [object copy];
    }
    

    主要区别在于现在有同一个对象的两个副本。现在,如果您更改类中的实例变量(例如将@"A" 更改为@"B"),原始对象将保持不变(仍将是@"A")。

    【讨论】:

    • 这些方法应该命名为setMyObject吗?
    • 另外,另一个“像这样的类型”是“assign”,用于复制原始类型(例如 int、float、BOOL)。
    • 如果您要手动实现一个保留设置器,那么您描述的方法不是这样做的。您应该首先检查“旧”字段值,如果它仍有值则释放它。但只有在旧值与您尝试设置的值不同时才这样做。 Everntually 你将有一个 4 到 5 行代码设置器。一旦你看到了,你会更加欣赏@property 符号! :)
    • @Tom van Zummeren - 你能举个例子吗?我没有得到@property 的全部力量......谢谢。
    【解决方案3】:

    作为一般规则,使用:

    @property(nonatomic, copy)
    

    ..对于 NSString 属性和 this 对于所有其他对象属性:

    @property(nonatomic, retain)
    

    【讨论】:

    • 实际上,既然 NSString 是不可变的,那么简单地为 NSString 使用@property(非原子,保留)不是更有意义吗?也许你的意思是相反的。
    • 我认为这个想法是制作一个副本,以防字符串实际上是一个可变字符串。这样字符串就不会在你身上意外改变。
    【解决方案4】:

    对于类型是符合 NSCopying 协议的不可变值类的属性,您几乎总是应该指定 **

    复制

    ** 在您的@property 声明中。指定**

    保留

    ** 在这种情况下你几乎不会想要。

    因为在几乎所有情况下,您都希望防止在其背后改变对象的属性,因此您应该将表示它们的属性标记为副本。 (如果您自己编写 setter 而不是使用 @synthesize,您应该记住实际使用 copy 而不是在其中保留。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      相关资源
      最近更新 更多