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
,因为name
是todo
对象的成员,其范围是本身。
没有其他的外部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属性的属性,我决定将所有的属性信息放在一起
- primefaces//默认
- 非primefaces
- 强=保留/ /默认
- 弱= unsafe_unretained
- 保留
- 分配//默认
- unsafe_unretained
- 复制
- 只读
- 读写//默认
所以下面是详细的文章链接,你可以在上面find所有的属性,这将有力地帮助你。 非常感谢所有在这里给出最佳答案的人!
iOS中的variables属性或修饰符
- 保留=强
- 它被保留,旧值被释放并被分配
- 保留指定应该发送的新值 – 在赋值时保留并且发送旧值 – 释放
- 保持一样强壮。
- 苹果说,如果你写保留它会自动转换/工作像只有强。
- 诸如“alloc”的方法包括一个隐含的“保留”
例:
@property (nonatomic, retain) NSString *name; @synthesize name;
- 分配
- 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语义。