我在单身人士中使用保留还是复制?

问题描述:

我读了一个地方,与一个对象的NSString,你必须使用副本,而不是保留。有人可以解释这是否正确,为什么?我在单身人士中使用保留还是复制?

例如我有以下声明为我的单身:

#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 
+1

你提到的代码是正确的。你必须使用保留。 – Satyam 2011-05-31 05:41:56

+0

这是我的理解,以及使用保留。我对这里的其他理论和理由感兴趣。春天想到的一个原因是复制意味着如果你通过了一个NSMutableString而不是NSString,那么如果可变字符串被另一个类改变了,你的类就不会受到影响。 NSString会有所不同,因为它是固定的。 – drekka 2011-05-31 05:52:57

+1

http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain – Jason 2011-05-31 05:57:08

我觉得“必须”在的意义上必须有点强。您可以兼用copyretain,但你应该一般使用copyNSString*属性,因为:

  1. 你通常不希望有一个字符串属性你的鼻子底下发生变化;
  2. NSMutableStringNSString的一个子类,因此有人可能会将NSString*属性设置为指向可变字符串,从而在您使用字符串时可能会更改字符串。
  3. 对于像NSString这样的不可变类,复制操作最终只是保留原始对象。

考虑这三个点,这是很难想象的很好的理由使用retain,而不是copyNSString性能。

+0

你也可以使用'assign'! ;) – justin 2011-05-31 06:38:44

你应该用在这种情况下,保留价值。原因是这样的 1.你不希望对象被释放 2.你很可能会想要改变NSString的值在某个点

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

对于这个实现,你应该使用retain,或者至少这就是我的理解。欲了解更多请看:http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html

您既可以使用,在这两种情况下你将对象的所有者需要dealloc的被释放。

copyretain之间的区别。

保留: - >它只是增加存在对象的保留计数。

副本: - >这箱子为你的财产

在这两种情况下,新的对象:你将有对象的所有权。

阅读Apple memory management concept

@克劳斯石塔:从苹果文档

你把一个对象的所有权,如果你 使用其名称 开始“黄金”,“新”,“复制”的方法创建它,或 “mutableCopy”(例如,alloc, newObject或mutableCopy),或者如果您向其发送保留消息 。

+0

@Jhaliya只是因为你保留一个对象并不意味着你成为所有者。正如@Caleb指出的那样,你无法保护不会有人向你发送一个NSMutableString,并在稍后改变它。 – 2011-05-31 07:05:32

+0

@克劳斯布洛奇:那么告诉......我们为什么要使用保留? – Jhaliya 2011-05-31 07:13:35

+0

@Jhaliya为了让我们自己参考一个对象,从而确保它不会在其他人放弃对它的兴趣时被释放掉 – 2011-05-31 07:39:46

您也可以使用复制而不是保留。我使用NSString的副本。关于这个话题有很好的讨论。这里是一个附加组件NSString Copy or Retain?

宁愿copy。你的班级是否是单身人士并不重要。

我写这是一个相当长的解释,在这里详细介绍可变和不可变类型: NSMutableString as retain/copy