0

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

我有一个简单的 ARC 类,它实现了 2 个 NSMutableSet 和 1 个 NSMutableArray。这 3 个变量是私有的,因此它们不会使用 @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 得到相同的结果!苹果说 + init 方法和 - init 方法在使用 ARC 时是一样的!它应该只改变预处理器完成类的方式。

声明 NSMutableArray *_outObjects; 作为 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 实现这种不同的行为?

先感谢您。加布里埃尔。

4

0 回答 0