2012-06-27 37 views
-1

首先问保留或复制的UIKit元素

当一个对象的属性被保留在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

谢谢!

+0

你的第一个问题不清楚,听起来像你误解了一些东西。你能发表一个片段来证明你在说什么吗?你的第二个问题有一个不正确的泛化 - 通常你使用'copy'来为其他类有可变子类('NSString','NSArray')和'retain' /'strong'的类。此外,“UIResponder”及其子类(构成GUI元素)通常不实现“NSCopying”,因此不能用于“copy”属性。 –

+0

我重写了我的第一个问题。我明白你的答案,谢谢。 – darksky

+0

对不起,它还不是很清楚。你“呼叫”_what_“两次”? “改变任何创建的类的属性” - 你的意思是“创建_instances_”?你是否设置了一个实例的属性来指向一个新的'NSURLRequest'实例,或者你是否将所有实例都设置为_same_'NSURLRequest'对象,然后改变它?一个[小而独立的例子](http://sscce.org)在这里真的很有帮助。 –

回答

0

保留告诉iOS不要释放那个内存,即使原始属性或指针将自己设置为零,这会减少保留计数。所以如果你做一个浅拷贝,将一个指针指向一个现有的对象,它将保留它。如果您需要进行深层复制,则应指定复制或创建复制构造函数。

弱引用类似于在一段内存中使用旧的“分配”方法,您不希望增加保留计数。有些情况下你可以有循环引用,并且可能永远不会释放内存。如果您不使用IB来创建UIKit对象,ARC将确保为您保留内存,前提是您拥有指向该对象的有效指针。例如,如果你有一个UIButton指针作为视图控制器的成员,并且你动态地创建一个按钮,只要该指针有效,它就会保留该内存,并且一旦该指针被设置为零,就释放它。

+0

噢,好的。请参阅我的第一个问题编辑。至于第二个问题,谢谢你的回答。所以一般来说,如果我保留一个UIKit元素并将其分配在init或viewDidLoad中,它将在视图的整个生命周期中保留,一旦它被卸载,它会自动将计数递减2并正确释放它。 – darksky

+0

如果你在一个对象上执行init,它的保留计数为1,当你需要删除那个对象时,你只需调用release来减少retain。这就是说,如果你使用ARC,你只需要担心指针的生命,编译器会为你插入正确的保留和释放 – rooster117