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

jin*_*ini 16 iphone objective-c ios

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

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

Pen*_*One 31

这是简短的回答:

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

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

assignvs retainvs copy确定合成访问器如何与Objective-C内存管理方案交互:

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


swi*_*Boy 17

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

  1. 原子//默认
  2. 非原子
  3. strong =保留//默认
  4. weak = unsafe_unretained
  5. 保留
  6. 分配//默认
  7. unsafe_unretained
  8. 复制
  9. 只读
  10. readwrite //默认

以下是详细的文章链接,您可以在其中找到上述所有属性,这些属性将极力帮助您.非常感谢所有在这里给出最佳答案的人!

iOS中的变量属性属性或修饰符

  1. 保留=强
    • 它被保留,旧值被释放并被分配
    • retain指定应该在发送时发送新值-retain并且发送旧值-release
    • 保留与强者一样.
    • 苹果说,如果你写保留它将自动转换/工作只有强大.
    • 像"alloc"这样的方法包含一个隐含的"保留"

例:

@property (nonatomic, retain) NSString *name;

@synthesize name;
Run Code Online (Sandbox Code Playgroud)
  1. 分配
    • assign是默认值,只是执行变量赋值
    • assign是一个属性属性,告诉编译器如何合成属性的setter实现
    • 我会使用assign表示C原语属性,而weak表示弱对Objective-C对象的引用.

例:

@property (nonatomic, assign) NSString *address;

@synthesize address;
Run Code Online (Sandbox Code Playgroud)
  1. 只读

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

例:

@property (nonatomic, readonly) NSString *name;

@synthesize name;
Run Code Online (Sandbox Code Playgroud)
  1. 读写
    • setter和getter生成.
    • 指示应将属性视为读/写.
    • 此属性是默认属性.
    • @implementation块中都需要getter和setter方法.如果在实现块中使用@synthesize指令,则会合成getter和setter方法.

例:

@property (nonatomic, readwrite) NSString *name;

@synthesize name;
Run Code Online (Sandbox Code Playgroud)

  • 弱!= unsafe_unretained (3认同)
  • 第二个链接说明了一切.unsafe_unretained在取消分配时不会使引用无效,因此您将留下悬空指针,而在释放对象时将弱属性设置为nil.Pre-ios 4.3,不支持弱. (2认同)

Chu*_*uck 16

readwrite意味着存在吸气剂和定位器; 相反的是readonly.通常,您明确声明属性的唯一时间readwrite是在公共接口声明属性的类的类扩展中readonly- 因此它是公共只读的,但在内部您可以获取和设置.

  • 非常好的答案.重要的是要知道何时应该使用`readwrite` (2认同)