【发布时间】:2012-06-27 19:00:19
【问题描述】:
第一个问题
当一个对象的属性在Objective-C中被保留时,为什么同一个类的第二个实例指向同一个对象?如果您实例化一个新类,那么从逻辑上讲,您会想要一个具有单独属性的单独类。 retain 我知道只增加保留计数,copy 将浅拷贝。
我创建了一个保留NSURLRequest 的类。我初始化了该类的两个实例。更改任何已创建类的属性都会更改它们。当我在该物业上使用副本时,它停止了这样做。然而,在线阅读,它说不可变对象上的copy 本质上是一个浅拷贝,因为你真的不想要一个单独的实体,因为它永远无法更改。在这种情况下,NSURLRequest 是不可变的,那么我的示例是如何通过在不可变对象上调用 copy 来工作的呢?这是我复制它的方式:
- (id)initWithRequest:(NSURLRequest *)request {
self = [super initWithNibName:nil bundle:nil];
if (self) {
_request = [request copy];
}
return self;
}
第二个问题
我一直在阅读,对于所有不可变对象,我需要使用 copy,而对于可变对象,请使用 retain(或者现在在 ARC 中,strong)。如果 IBOutlets 是 weak 指针,如果我在没有 Interface Builder 的情况下绘制视图怎么办? UIKit 元素会是 copy 还是 retain/strong?
谢谢!
【问题讨论】:
-
您的第一个问题不清楚,听起来您误解了什么。你能发布一个sn-p来展示你在说什么吗?你的第二个问题有一个不正确的概括——通常你对具有可变子类(
NSString、NSArray)的类使用copy,对其他问题使用retain/strong。此外,UIResponder及其子类(构成 GUI 元素)通常不实现NSCopying,因此不能在copy属性中使用。 -
我重写了我的第一个问题。我明白了你对我第二次的回答,谢谢。
-
抱歉,还不是很清楚。你“叫”了什么“两次”? “更改任何已创建类的属性”——您的意思是“已创建 instances”?您是否将一个实例的属性设置为指向
NSURLRequest的新实例,或者您是否将所有实例设置为 sameNSURLRequest对象然后更改它? Small, Self-contained Example 在这里真的很有帮助。
标签: objective-c cocoa-touch memory-management properties uikit