1

在 ARC 中,所有实例变量和局部变量默认都对它们所指向的对象具有强引用。我试图了解 MRR 的工作原理并遇到了这个例子。考虑下面的片段:

// CarStore.h #import

@interface CarStore : NSObject

- (NSMutableArray *)inventory;
- (void)setInventory:(NSMutableArray *)newInventory;

@end

// CarStore.m
#import "CarStore.h"

@implementation CarStore {
    NSMutableArray *_inventory;
}

- (NSMutableArray *)inventory {
    return _inventory;
}

- (void)setInventory:(NSMutableArray *)newInventory {
    _inventory = newInventory;
}

@end

//回到main.m,让我们创建一个库存变量并将其分配给CarStore的库存属性: int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray *inventory = [[NSMutableArray alloc] init]; [库存 addObject:@"本田思域"];

        CarStore *superstore = [[CarStore alloc] init];
        [superstore setInventory:inventory];
        [inventory release];

        // Do some other stuff...

        // Try to access the property later on (error!)
        NSLog(@"%@", [superstore inventory]); //DANGLING POINTER
    }
    return 0;
}

main 方法最后一行的inventory 属性是一个悬空指针,因为该对象已经在main.m 中早些时候释放了。现在,superstore 对象对数组有一个弱引用。

这是否意味着在 ARC 之前,实例变量默认具有弱引用,我们必须使用保留来声明强引用?

4

1 回答 1

0

在 ARC 之前,它们默认为 __unsafe_unretained。Weak 与 ARC 一起被引入。

于 2013-08-17T17:18:10.660 回答