非原子强/复制?
Nonatomic strong / copy?
我正在构建一个应用程序,而我有一个 ViewController 查看自定义对象,让我们调用这个对象 "CustomObject"。按下按钮后,将触发 segue,因此在我获得目的地 ViewController 并传递 self.myObject 的地方调用 prepareForSegue。目标 ViewController 可能会更改 CustomObject 的一些部分,但如果用户决定返回原始 ViewController,则这些更改不应反映在原始 ViewController 中。仅当用户在目标 ViewController 中按下 "Save" 并因此触发带有 CustomObject 版本的 NSNotification 时才应反映更改,该版本应在原始 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;
}
您应该使用 "copy",因为 "copy" 创建了该对象的重复实例,并且新对象独立于原始对象。 "strong"给对象添加一个"link",它只有一个对象。
我觉得你可以去复制。因为它可以在对象可变时使用。如果您需要对象此时的值,请使用它。您不希望该值反映该对象的其他所有者所做的任何更改。您需要在使用完对象后释放该对象,因为您保留了副本。
Pl。还请参考下面的 link,它可以很好地了解何时使用哪个 属性。
Objective-C declared @property attributes (nonatomic, copy, strong, weak)
您应该使用 strong
,但(在 prepareForSegue
中)创建并传递一个副本(或只是一个不同的对象,但无论如何,不要传递原始对象)。
这与设计 copy
属性 属性的情况相反。使用 copy
属性 属性,接收者希望确保对象不会在他背后发生变异:例如,我接受一个 NSString 但调用者传递给我一个 NSMutableString 并保留它,所以现在可以在我背后更改我的字符串。通过调用 copy
,我将 NSMutableString 转换为不可变的 NSString。
你的情况,正如我所说,正好相反。你的第一个视图控制器想要传递一个对象而不会有任何影响他自己的对象的风险。因此,由你的第一个视图控制器来创建一个新对象并传递它,而不是传递一个指向他自己的神圣对象的指针。知道第一个视图控制器需要保护不是第二个视图控制器的工作;这取决于你的第一个视图控制器来保护自己。
我正在构建一个应用程序,而我有一个 ViewController 查看自定义对象,让我们调用这个对象 "CustomObject"。按下按钮后,将触发 segue,因此在我获得目的地 ViewController 并传递 self.myObject 的地方调用 prepareForSegue。目标 ViewController 可能会更改 CustomObject 的一些部分,但如果用户决定返回原始 ViewController,则这些更改不应反映在原始 ViewController 中。仅当用户在目标 ViewController 中按下 "Save" 并因此触发带有 CustomObject 版本的 NSNotification 时才应反映更改,该版本应在原始 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;
}
您应该使用 "copy",因为 "copy" 创建了该对象的重复实例,并且新对象独立于原始对象。 "strong"给对象添加一个"link",它只有一个对象。
我觉得你可以去复制。因为它可以在对象可变时使用。如果您需要对象此时的值,请使用它。您不希望该值反映该对象的其他所有者所做的任何更改。您需要在使用完对象后释放该对象,因为您保留了副本。
Pl。还请参考下面的 link,它可以很好地了解何时使用哪个 属性。 Objective-C declared @property attributes (nonatomic, copy, strong, weak)
您应该使用 strong
,但(在 prepareForSegue
中)创建并传递一个副本(或只是一个不同的对象,但无论如何,不要传递原始对象)。
这与设计 copy
属性 属性的情况相反。使用 copy
属性 属性,接收者希望确保对象不会在他背后发生变异:例如,我接受一个 NSString 但调用者传递给我一个 NSMutableString 并保留它,所以现在可以在我背后更改我的字符串。通过调用 copy
,我将 NSMutableString 转换为不可变的 NSString。
你的情况,正如我所说,正好相反。你的第一个视图控制器想要传递一个对象而不会有任何影响他自己的对象的风险。因此,由你的第一个视图控制器来创建一个新对象并传递它,而不是传递一个指向他自己的神圣对象的指针。知道第一个视图控制器需要保护不是第二个视图控制器的工作;这取决于你的第一个视图控制器来保护自己。