0

これはばかげた質問ですが、それは私を夢中にさせています!!

2 つの NSMutableSet と 1 つの NSMutableArray を実装する単純な ARC クラスがあります。これら 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を使用して同じ結果を期待していました!! Apple によれば、+ 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