readwrite属性和非原子赋值属性之间有什么区别?

时间:2011-08-16 21:19:47

标签: iphone ios objective-c

我在int,BOOL等上看到了与非原子,assign相同的readwrite。

我对此感到困惑。我知道在非本机对象上,我们通常做非原子的,保留。

3 个答案:

答案 0 :(得分:31)

这是简短的回答:

atomic vs nonatomic主要确保从合成的getter返回完整的值,并且完整的值由合成的setter写入(原子是默认的。)

readwrite vs readonly确定合成属性是否具有合成访问者(readwrite具有setter并且是默认值,readonly不是)。

assign vs retain vs copy确定合成访问者如何与Objective-C内存管理方案交互:

  • assign是默认值,只是执行变量赋值
  • retain指定应在发送时发送新值-retain并发送旧值-release
  • copy指定应在发送时发送新值-copy并发送旧值-release

答案 1 :(得分:17)

在阅读了如此多的文章,SO帖子和制作演示应用以检查变量属性属性后,我决定将所有属性信息放在一起

  1. atomic // default
  2. 非原子
  3. strong = retain // default
  4. weak = unsafe_unretained
  5. 保留
  6. assign // default
  7. unsafe_unretained
  8. 复制
  9. 只读
  10. readwrite // default
  11. 以下是详细的文章链接,您可以在其中找到上述所有属性,这些属性将极力帮助您。 非常感谢所有在这里给出最佳答案的人!!

      

    Variable property attributes or Modifiers in iOS

    1. retain = strong
      • 保留,旧值被释放并被分配
      • retain指定应在发送时发送新值-retain,并发送旧值-release
      • 保留与强者相同。
      • apple说如果你写保留它会自动转换/工作就像强大。
      • 像“alloc”这样的方法包含一个隐含的“retain”
    2. 示例:

      @property (nonatomic, retain) NSString *name;
      
      @synthesize name;
      
      1. 指定
        • assign是默认值,只是执行变量赋值
        • assign是一个属性属性,告诉编译器如何合成属性的setter实现
        • 我会使用assign表示C原语属性,而weak表示弱对Objective-C对象的引用。
      2. 示例:

        @property (nonatomic, assign) NSString *address;
        
        @synthesize address;
        
        1. <强>只读

          • 将您的属性声明为readonly,告诉编译器不要自动生成setter方法。
          • 表示该属性为只读。
          • 如果指定readonly,则@implementation块中只需要一个getter方法。如果你在中使用@synthesize指令 @implementation块,只合成getter方法。此外,如果您尝试使用点语法分配值, 你得到一个编译器错误。
        2. 示例:

          @property (nonatomic, readonly) NSString *name;
          
          @synthesize name;
          
          1. 读写
            • 生成了setter和getter。
            • 表示应将该属性视为读/写。
            • 此属性是默认属性。
            • @implementation块中需要getter和setter方法。如果在实现中使用@synthesize指令 块,getter和setter方法是合成的。
          2. 示例:

            @property (nonatomic, readwrite) NSString *name;
            
            @synthesize name;
            

答案 2 :(得分:15)

readwrite表示存在getter和setter;相反的是readonly。通常情况下,您明确声明属性readwrite的唯一时间是在公共接口声明属性readonly的类的类扩展中 - 因此它是公开只读的,但在内部您可以同时得到并设定。