这是一个愚蠢的问题,但它让我发疯了!
我有一个简单的ARC类,它实现了2个NSMutableSet和1个NSMutableArray。这三个变量是私有的,因此它们不会使用@property公开,但我知道,默认情况下,类的对象var被定义为__strong。
问题是,在未来的某个时间类方法中, - (id)drawObject,内部访问NSMutableArray,一旦方法访问_outObjects var就会崩溃。因此调试在init中初始化的NSMutableArray的接缝已经消失了(我能够在init中读取它,它显然是空的,但我无法在drawObject中读取它,因为它已被释放。)
从
更改init行可以解决问题_outObjects = [NSMutableArray arrayWithCapacity:_objects.count];
到
_outObjects = [[NSMutableArray alloc] initWithCapacity:_objects.count];
但我期望使用ARC的结果相同! Apple说使用ARC的+ init方法和 - init方法是一样的!它应该只改变预处理器完成类的方式。
声明NSMutableArray * _outObjects; as NSMutableArray __strong * _outObjects;显然没用,因为它已经是默认的。
这里是标题
@interface GTGameBag : NSObject {
@protected
NSMutableSet *_objects;
NSMutableSet *_innerObjects;
NSMutableArray *_outObjects;
}
- (id)initWithObjects:(NSSet*)objects;
- (id)drawObject;
这里的实现
- (id)initWithObjects:(NSSet *)objects {
self = [super init];
if (self) {
_objects = [objects mutableCopy];
_outObjects = [NSMutableArray arrayWithCapacity:_objects.count];
_innerObjects = [_objects mutableCopy];
}
return self;
}
- (id)drawObject {
id obj = [_innerObjects anyObject];
[_innerObjects removeObject:obj];
[_outObjects addObject:obj];
return obj;
}
使用+和 - 方法分配空数组时,使用ARC的这种不同行为怎么可能?
提前谢谢你。 加布里埃尔。