-1

第一个问题

当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元素是copyor retain/吗strong

谢谢!

4

1 回答 1

0

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

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

于 2012-06-27T19:06:59.963 回答