在 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 之前,实例变量默认具有弱引用,我们必须使用保留来声明强引用?