在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:@“Honda Civic”];
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中释放。现在,超级市场对象对数组有一个弱引用。
这是否意味着在ARC之前,实例变量默认具有弱引用,我们必须使用retain来声明强引用?
答案 0 :(得分:0)
在ARC之前,默认情况下它们是__unsafe_unretained。与ARC一起引入了弱点。