objective-c中copy属性的自定义setter

时间:2014-04-16 07:56:37

标签: ios objective-c properties setter

我是否必须使用objective-c中的copy属性手动复制自定义setter中的对象? 例如,

我有一个属性:

@property (copy, nonatomic) NSString *someString;

和自定义设置器:

- (void)setSomeString:(NSString *)someString
{
  //option 1
  _someString = someString;
  //option 2
  _someString = [someString copy];
  //do other stuff
}

选项1是否足以用于自定义设置器,或者我必须使用选项2才能复制对象?

4 个答案:

答案 0 :(得分:4)

你可以做任何你喜欢的事,但你应该使用第二个选项。 这是因为它会像代码文档一样,如果其他开发人员看到它,他或她会知道你只是通过查看来复制字符串:

@property (copy, nonatomic) NSString *someString;

如果您使用保留/分配它的最佳做法来保留/分配自定义设置器中的对象,则相同。它将使您的代码更清晰,更有文档记录,并且对其他开发人员来说更容易理解。

答案 1 :(得分:1)

您必须使用"选项2"因为你正在使用" copy"为您的财产和声明:

_someString = [someString copy];

将在内存中创建一个新对象并将其分配给您的属性对象。

答案 2 :(得分:1)

如果您编写自己的自定义setter,那么您将对它所做的一切负全部责任。在您的情况下,您对代码选项1引入的错误负全部责任:如果我将someObject.someString设置为可变字符串并稍后更改字符串,那么对象中的字符串将更改哪个是最明确的不是你对复制属性的期望。

此外,如果您同时拥有自定义setter和getter(或者只读属性的自定义getter),那么没有编译器生成的getter或setter,编译器不会为您创建实例变量;你必须自己做。

您还应该注意到,不可变对象的“复制”实际上并不复制它们,只是保留它们,因此通常“复制”操作非常便宜,当我传递一个可变对象时,“复制”很可能无论如何你想要什么。

答案 3 :(得分:-2)

如果您想制作自己的制定者,请使用选项2,但不要忘记在声明之前添加条件,如...

if(_someString) {
    [_someString release]; 
}

注意: - 如果是ARC使用声明" _someString = nil"代替 " [_someString release]";