Objective-C 101(保留vs指定)NSString

101个问题

比方说,我正在制作汽车数据库,每个汽车对象被定义为:

#import <UIKit/UIKit.h> @interface Car:NSObject{ NSString *name; } @property(nonatomic, retain) NSString *name; 

为什么是@property(nonatomic, retain) NSString *name; 而不是@property(nonatomic, assign) NSString *name;

我明白, assign不会像retain那样增加参考计数器。 但是,为什么使用retain ,因为nametodo对象的成员,其范围是本身。

没有其他的外部function会修改它。

Objective-C中没有“对象的范围”这样的事情。 范围规则与对象的生命周期无关 – 保留计数就是一切。

您通常需要声明您的实例variables的所有权。 请参阅Objective-C内存pipe理规则 。 有了retain财产,你的财产inheritance人声称新价值的所有权,并放弃旧的所有权。 使用assign属性时,周围的代码必须这样做,这在责任和关注点分离方面也是一样的。 您将使用assign属性的原因是在您无法保留该值(例如BOOL或NSRect等非对象types)的情况下,或者在保留该值时会导致不需要的副作用。

顺便说一句,在NSString的情况下,正确的属性types通常是copy 。 这样,如果有人传入一个NSMutableString(这是有效的 – 这一种NSString),它不能从你下面更改。

不要忘了通过它来访问它

 self.name = something; 

因为

 name = something; 

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

如果没有retain ,就不能保证你设置的NSString* name将比赋值语句本身更长。 通过使用合成的setter的retain属性,你可以告诉内存pipe理系统至less还有一个对象保持NSString*

对于那些正在寻找它的人来说,苹果的财产属性文件就在这里 。

self. 在:

 self.name = something; 

很重要! 没有它,你直接访问variables,绕过setter。

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

 [self setName:something]; 

无论如何,这个符号是我在NSStrings上寻找正确的@properties时真正需要的(模糊熟悉的)build议。 谢谢阿克塞尔。

阅读了这么多的文章后,SOpost和制作演示应用程序来检查variables属性的属性,我决定将所有的属性信息放在一起

  1. primefaces//默认
  2. 非primefaces
  3. 强=保留/ /默认
  4. 弱= unsafe_unretained
  5. 保留
  6. 分配//默认
  7. unsafe_unretained
  8. 复制
  9. 只读
  10. 读写//默认

所以下面是详细的文章链接,你可以在上面find所有的属性,这将有力地帮助你。 非常感谢所有在这里给出最佳答案的人!

iOS中的variables属性或修饰符

  1. 保留=强
    • 它被保留,旧值被释放并被分配
    • 保留指定应该发送的新值 – 在赋值时保留并且发送旧值 – 释放
    • 保持一样强壮。
    • 苹果说,如果你写保留它会自动转换/工作像只有强。
    • 诸如“alloc”的方法包括一个隐含的“保留”

例:

 @property (nonatomic, retain) NSString *name; @synthesize name; 
  1. 分配
    • assign是默认值,只是执行variables赋值
    • assign是一个属性属性,告诉编译器如何综合属性的setter实现
    • 我将使用C语言的原始属性赋值,弱赋值给Objective-C对象。

例:

 @property (nonatomic, assign) NSString *address; @synthesize address; 

Google的Objective-C风格指南涵盖了这一点:

安装程序采取NSString,应该总是复制它接受的string。 永远不要只保留string。 这可以避免来电者在您不知情的情况下更改您的电话号码。 不要认为,因为你接受一个NSString,它实际上不是一个NSMutableString。

如果你的class级有这个string对象,然后从它下面消失,会不会是不幸的? 你知道,就像你的class级第二次提到这个对象一样,它被另一个对象释放了吗?

这就是为什么你要使用retain setter语义。