使用ARC的类init ...使用+便捷方法而不是 - init时意外的数组释放

时间:2012-08-09 07:43:22

标签: iphone nsmutablearray nsarray automatic-ref-counting

这是一个愚蠢的问题,但它让我发疯了!

我有一个简单的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的这种不同行为怎么可能?

提前谢谢你。 加布里埃尔。

0 个答案:

没有答案