Objective-C 101(保留vs赋值)NSString

qst*_*tar 54 iphone objective-c nsstring retain ios

一个101问题

假设我正在制作汽车数据库,每个汽车对象定义为:

#import <UIKit/UIKit.h>

@interface Car:NSObject{
    NSString *name;
}

@property(nonatomic, retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)

为什么@property(nonatomic, retain) NSString *name;@property(nonatomic, assign) NSString *name;呢?

据我所知,assign这不会增加引用计数器retain.但是为什么要使用retain,因为它是对象的name成员todo,它的范围就是它自己.

没有其他外部功能也会修改它.

Chu*_*uck 68

Objective-C中没有"对象的范围"这样的东西.范围规则与对象的生命周期无关 - 保留计数就是一切.

您通常需要声明实例变量的所有权.请参阅Objective-C内存管理规则.对于retain房产,您的房产所有者声称拥有新价值并放弃旧房产的所有权.对于一个assign属性,周围的代码必须这样做,这在责任和关注点分离方面同样混乱.您将使用assign属性的原因是您无法保留该值(例如BOOL或NSRect等非对象类型),或者保留它会导致不必要的副作用.

顺便提一下,在NSString的情况下,通常是正确的属性copy.这样,如果有人传入NSMutableString(它是有效的 - 它一种NSString),它就无法从你身下改变.

  • 对于具有可变变体的所有类,您应该使用copy而不是retain.例如.NSAArray,NSSet,NSDictionary,NSData,NSCharacterSet,NSIndexSet和NSString. (10认同)
  • 根据经验,所有带对象引用的属性都应该使用copy或retain,但有一个例外; 委托被指派以避免循环引用. (9认同)
  • @PeyloW:不只是代表; 任何不属于拥有关系的东西都应该使用`assign`而不是`copy`或`retain`.对象图中的路径应该是拥有的; 图表中的路径(包括在内)应该是非拥有的.否则,您将创建循环引用而不在圆圈中具有委托. (2认同)

Axe*_*xel 19

并且不要忘记通过它访问它

self.name = something;
Run Code Online (Sandbox Code Playgroud)

因为

name = something;
Run Code Online (Sandbox Code Playgroud)

不会关心生成的setter/getter方法,而是直接赋值.


fbr*_*eto 12

如果retain没有保证,NSString*你的设置name将比任务声明本身更长.通过使用retain合成setter 的属性,您可以让它告诉内存管理系统至少还有一个对象有兴趣保留它NSString*.

  • 保留确保它将*保持活着,而对于赋值,则无法保证.保留意味着您拥有该对象,只要您拥有该对象,它就不会被破坏.分配给你没有这样的保证. (8认同)
  • @qstar:NSInteger不是一个对象. (2认同)

tbo*_*one 9

对于那些正在寻找它的人来说,Apple的属性属性文档就在这里.

  • 该链接不再可用. (4认同)

小智 9

self.在:

self.name = something;
Run Code Online (Sandbox Code Playgroud)

很重要!没有它,您将直接访问变量并绕过setter.

旧的风格(如果我错了,纠正我)会是:

[self setName:something];
Run Code Online (Sandbox Code Playgroud)

无论如何,这个符号是,当我去寻找正确的,我真的很需要(有些眼熟探空)的建议@propertiesNSStrings.谢谢阿克塞尔.


swi*_*Boy 8

在阅读了如此多的文章,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)