我在单身人士中使用保留或复制吗?

时间:2011-05-31 05:38:21

标签: iphone ios

我读到某个地方,在对象中使用NSString,必须使用copy而不是retain。有人可以解释这是否正确以及为什么?

例如,我的单身人士有以下声明:

#import <foundation/Foundation.h>
@class FaxRecipient;

@interface MyManager : NSObject {
    NSString *subject;
    NSString *reference;
    NSString *coverSheet;
    FaxRecipient *faxRecipient;

}

@property (nonatomic, retain) NSString *test1;
@property (nonatomic, retain) NSString *test2;
@property (nonatomic, retain) NSString *test3;
@property (nonatomic,retain) FaxRecipient *faxRecipient;



+ (id)sharedManager;

@end

5 个答案:

答案 0 :(得分:8)

我认为必须意义上的“必须”有点强。您可以使用copyretain,但 通常会copy用于NSString*属性,因为:

  1. 您通常不希望在您的鼻子下改变字符串属性;
  2. NSMutableStringNSString的子类,因此有人可能会将您的NSString*属性设置为指向可变字符串,从而创建了更改字符串的可能性当你正在使用它时;
  3. 对于像NSString这样的不可变类,复制操作最终只会保留原始对象。
  4. 考虑到这三点,很难想出使用retain而不是copy来表示NSString属性的充分理由。

答案 1 :(得分:4)

更喜欢copy。你的班级是否是单身人士并不重要。

我为此写了一个相当冗长的解释,其中详细介绍了可变和不可变类型: NSMutableString as retain/copy

答案 2 :(得分:3)

您也可以使用copy而不是retain。我使用NSString的副本。关于这个主题有很好的讨论。这是一个stackoverflow帖子NSString Copy or Retain?

答案 3 :(得分:0)

您可以使用两种情况,您将成为对象的所有者,并且需要在 dealloc 中发布。

copyretain之间的区别。

保留: - &gt;它只是增加了对象的保留计数。

复制 - &gt;它为您的财产创建新对象

在这两种情况下:您将拥有对象的所有权。

阅读Apple memory management concept

@ Claus Broch:来自Apple文档

  

如果您拥有对象的所有权   使用名称为的方法创建它   以“alloc”,“new”,“copy”或者开头   “mutableCopy”(例如,alloc,   newObject,或mutableCopy),或者如果你   发送保留信息。

答案 4 :(得分:-2)

您应该在此实例中使用retain值。原因是这样的 1.您不希望对象被释放 2.你很可能想要在某个时候改变NSString的值

使用copy属性基本上是说NSString的值不应该在没有警告的情况下改变。即它将停止同时设置和检索的NSString的值。

对于这个实现,你应该使用retain,或者至少我的理解。有关详情,请点击此处:http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html