0

同様のオブジェクトのグループを同じ方法で初期化する必要があるクラスがあります。

NSNumber *a = nil;
NSNumber *b = nil;
NSNumber *c = nil;

a、b、および c は、既存のオブジェクトのメンバー変数です。私のコードでは、より複雑な NSObject サブクラスを使用していますが、この例は NSNumbers を使用する方が理解しやすいです。

3 つのオブジェクトはすべて、同様の方法で初期化する必要があります。したがって、次のように for ループ内で使用できるポインターの配列を作成したいと考えています。

NSPointerArray *objs = [NSPointerArray weakObjectsPointerArray];
[objs addPointer:&a];
[objs addPointer:&b];
[objs addPointer:&c];

上記のコードを実行すると、次のエラーが発生します。

error: address doesn't contain a section that points to a section in a object file

このようなループで探索できる配列を構築するにはどうすればよいですか?

    for (id *o in objs) {
        *o = @2;
    }
4

1 に答える 1

5

「NSValue」オブジェクトでポインターをラップするだけで問題ありません

id v1 = [NSValue valueWithPointer:p1];
id v2 = [NSValue valueWithPointer:p2];
id v3 = [NSValue valueWithPointer:p3];

id array = @[v1,v2,v3];

for(NSValue *value in array) {
    void *pointer = value.pointerValue;
    NSNumber *n = (__bridge NSNumber*)pointer;
}

あなたがやりたいことのデモが表示されます:(NSNumbersは不変です)

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
@autoreleasepool {
    NSNumber *a;
    NSNumber *b;

    NSArray *os = @[ [NSValue valueWithPointer:&a],
                 [NSValue valueWithPointer:&b] ];

    for (NSValue *v in os) {
        void *pointer = [v pointerValue];
        NSNumber **n_ptr = (__bridge NSNumber**)pointer; 
        *n_ptr = @2.0;
    }

    NSLog(@"%@ %@", a,b);
}
}
于 2012-12-22T18:01:08.030 に答える