[英]Objective-C 101 (retain vs assign) 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
对象的成员,所以它的范围就是它自己。
其他任何外部功能也不会对其进行修改。
在Objective-C中,没有“对象范围”之类的东西。 范围规则与对象的生存期无关—保留计数就是一切。
通常,您需要声明实例变量的所有权。 请参阅Objective-C内存管理规则 。 有了retain
财产,您的财产设定者会要求拥有新价值,而放弃旧价值。 使用assign
属性,周围的代码必须执行此操作,就责任和关注点分离而言,情况同样如此。 使用assign
属性的原因是在无法保留该值的情况下(例如BOOL或NSRect等非对象类型),或者在保留该值时会导致不良的副作用。
顺便说一句,对于NSString,通常正确的属性是copy
。 这样,如果有人传入NSMutableString(这是有效的-这是一种NSString),它就不会从您的下方改变。
并且不要忘记通过访问它
self.name = something;
因为
name = something;
不会关心生成的setter / getter方法,而是直接分配值。
如果没有retain
,则不能保证您设置name
的NSString*
寿命将比赋值语句本身更长。 通过对合成的setter使用retain
属性,您可以让它告诉内存管理系统至少还有一个对象有兴趣保留NSString*
。
对于那些正在寻找它的人,Apple的属性属性文档在这里 。
self.
在:
self.name = something;
重要! 没有它,您将直接访问变量并绕过setter。
较旧的样式(如果我错了,请纠正我)是:
[self setName:something];
无论如何,这种表示法是我在NSStrings
上寻找适当的@properties
时真正需要的(有点熟悉的听起来)建议。 谢谢阿克塞尔。
阅读了这么多文章,SO帖子并制作了演示应用程序以检查Variable属性后,我决定将所有属性信息放在一起
因此,下面是详细的文章链接,您可以在其中找到上述所有属性,这些都会对您有帮助。 非常感谢在这里给出最佳答案的所有人!!
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, assign) NSString *address;
@synthesize address;
Google的《 Objective-C风格指南》涵盖了以下方面:
使用NSString的设置者应始终复制其接受的字符串。 永远不要只保留字符串。 这样可以避免呼叫者在您不知情的情况下更改它。 不要以为是因为您接受的NSString实际上不是NSMutableString。
如果您的班级得到了这个字符串对象,然后又从下面消失了,那会很不幸吗? 您知道吗,就像您的类第二次提到该对象一样,它又被另一个对象取消分配了?
这就是为什么要使用retain
设置器语义的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.