繁体   English   中英

Objective-C 101(保留与分配)NSString

[英]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 ,因为nametodo对象的成员,所以它的范围就是它自己。

其他任何外部功能也不会对其进行修改。

在Objective-C中,没有“对象范围”之类的东西。 范围规则与对象的生存期无关—保留计数就是一切。

通常,您需要声明实例变量的所有权。 请参阅Objective-C内存管理规则 有了retain财产,您的财产设定者会要求拥有新价值,而放弃旧价值。 使用assign属性,周围的代码必须执行此操作,就责任和关注点分离而言,情况同样如此。 使用assign属性的原因是在无法保留该值的情况下(例如BOOL或NSRect等非对象类型),或者在保留该值时会导致不良的副作用。

顺便说一句,对于NSString,通常正确的属性是copy 这样,如果有人传入NSMutableString(这是有效的-这一种NSString),它就不会从您的下方改变。

并且不要忘记通过访问它

self.name = something;

因为

name = something;

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

如果没有retain ,则不能保证您设置nameNSString*寿命将比赋值语句本身更长。 通过对合成的setter使用retain属性,您可以让它告诉内存管理系统至少还有一个对象有兴趣保留NSString*

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

self. 在:

self.name = something;

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

较旧的样式(如果我错了,请纠正我)是:

[self setName:something];

无论如何,这种表示法是我在NSStrings上寻找适当的@properties时真正需要的(有点熟悉的听起来)建议。 谢谢阿克塞尔。

阅读了这么多文章,SO帖子并制作了演示应用程序以检查Variable属性后,我决定将所有属性信息放在一起

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

因此,下面是详细的文章链接,您可以在其中找到上述所有属性,这些都会对您有帮助。 非常感谢在这里给出最佳答案的所有人!!

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

  1. 保留=强
    • 保留它,释放旧值并分配它
    • 保留指定新值应发送-保留分配和旧值发送-release
    • 保留与坚强相同。
    • 苹果说,如果您写保留,它将自动转换/仅像强一样工作。
    • 像“分配”这样的方法包括一个隐式的“保留”

例:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. 分配
    • 指定是默认值,仅执行变量分配
    • Assign是一个属性属性,它告诉编译器如何综合该属性的setter实现
    • 我将对C基本属性使用assign,对Objective-C对象的弱引用使用weak。

例:

@property (nonatomic, assign) NSString *address;

@synthesize address;

Google的《 Objective-C风格指南》涵盖了以下方面:

使用NSString的设置者应始终复制其接受的字符串。 永远不要只保留字符串。 这样可以避免呼叫者在您不知情的情况下更改它。 不要以为是因为您接受的NSString实际上不是NSMutableString。

如果您的班级得到了这个字符串对象,然后又从下面消失了,那会很不幸吗? 您知道吗,就像您的类第二次提到该对象一样,它又被另一个对象取消分配了?

这就是为什么要使用retain设置器语义的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM