当一个对象的属性被保留在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
?
谢谢!
你的第一个问题不清楚,听起来像你误解了一些东西。你能发表一个片段来证明你在说什么吗?你的第二个问题有一个不正确的泛化 - 通常你使用'copy'来为其他类有可变子类('NSString','NSArray')和'retain' /'strong'的类。此外,“UIResponder”及其子类(构成GUI元素)通常不实现“NSCopying”,因此不能用于“copy”属性。 –
我重写了我的第一个问题。我明白你的答案,谢谢。 – darksky
对不起,它还不是很清楚。你“呼叫”_what_“两次”? “改变任何创建的类的属性” - 你的意思是“创建_instances_”?你是否设置了一个实例的属性来指向一个新的'NSURLRequest'实例,或者你是否将所有实例都设置为_same_'NSURLRequest'对象,然后改变它?一个[小而独立的例子](http://sscce.org)在这里真的很有帮助。 –