第一个问题
当在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
?
谢谢!
答案 0 :(得分:0)
保留告诉iOS不释放该内存,即使原始属性或指针将自身设置为nil会减少保留计数。因此,如果你做一个浅拷贝,它会指定一个指向现有对象的指针,它将保留它。如果您需要进行深层复制,则应指定复制或创建复制构造函数。
弱引用类似于在一块内存上使用旧的“assign”方法,您不希望增加保留计数。在某些情况下,您可以使用循环引用,并且可能永远不会释放内存。如果您不使用IB来创建UIKit对象,假设您有一个指向该对象的有效指针,ARC将确保为您保留内存。例如,如果您有一个UIButton指针作为视图控制器的成员,并且您动态创建一个按钮,只要该指针有效就会保留该内存,并在指针设置为nil后释放它。