非原子强/复制?

时间:2015-04-17 17:14:39

标签: ios objective-c uiviewcontroller nsobject

我正在构建应用程序,而我有一个查看自定义对象的ViewController,我们可以调用此对象" CustomObject"。按下按钮后,会触发一个segue,因此调用prepareForSegue,我获取目标ViewController并传递self.myObject。目标ViewController可能会更改CustomObject的一些部分,但如果用户决定返回原始ViewController,则这些更改不应反映在原始ViewController中。只有在用户按下" Save"在目标ViewController中,因此触发NSNotification与一个版本的CustomObject,应该在原始ViewController中重新加载,如下所示:

self.myObject = (CustomObject *)notification.object;

所以我的问题如下:我应该使用哪一种(或其他任何正确的) - 以及为什么?

@property (nonatomic, strong) CustomObject *myObject;
@property (nonatomic, copy) CustomObject *myObject;

谢谢!

更新

头文件:

@interface CustomObject : NSObject <NSCopying>

实施档案:

- (id)copyWithZone:(NSZone *)zone
{
id copy = [[[self class] alloc] init];
if (copy)
{
    // Copy NSObject subclasses
    [copy setRegisterDate:[self.registerDate copyWithZone:zone]];

}
return copy;
}

3 个答案:

答案 0 :(得分:2)

你应该使用strong但是(在prepareForSegue中)创建并传递一个副本(或者只是一个不同的对象,但无论如何,不​​要传递原始对象)。

这与copy属性设计的情况相反。使用copy属性属性,接收者想要确保该对象稍后不会变异:例如,我接受一个NSString但是调用者传递给我一个NSMutableString并保留它,以便我的字符串可以现在在我背后改变。通过调用copy,我将NSMutableString转换为NSString,这是不可变的。

正如我所说,你的情况正好相反。您的第一个视图控制器想要传递一个对象而不会有任何影响他自己的对象的风险。因此,由您的第一个视图控制器创建一个新对象并传递它,而不是将指针传递给他自己的神圣对象。知道您的第一个视图控制器需要保护,这不是您的第二个视图控制器的工作;由你的第一个视图控制器来保护自己。

答案 1 :(得分:0)

您应该使用“copy”,因为“copy”会创建该对象的重复实例,并且新对象独立于原始对象。 “strong”为对象添加了一个“链接”,它只是一个对象。

答案 2 :(得分:0)

我觉得你可以去复制。因为它可以在对象可变时使用。如果您需要此时的对象值,请使用此选项。您不希望该值反映该对象的其他所有者所做的任何更改。完成后,您需要释放该对象,因为您要保留该副本。

PL。请参阅以下链接,该链接可以很好地了解何时使用哪个属性。 Objective-C declared @property attributes (nonatomic, copy, strong, weak)