保留或复制UIKit元素

时间:2012-06-27 19:00:20

标签: objective-c cocoa-touch memory-management properties uikit

第一个问题

当在Objective-C中保留对象的属性时,为什么同一个类的第二个实例指向同一个对象?如果您实例化一个新类,那么您在逻辑上需要一个具有单独属性的单独类。 retain我理解只会增加保留计数,而copy会浅层复制。

我创建了一个保留NSURLRequest的类。我初始化了该类的两个实例。更改任何已创建的类的属性将更改所有类。当我在属性上使用copy时,它就停止这样做了。然而,在线阅读,它说不可变对象上的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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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