4

Class 型の ivar が必要で、ポインターが渡された後もポインターを保持したいのですが、何をしても、arc はそれをさせてくれません。たとえば、私が宣言した場合

@property (nonatomic, strong) Class myClass;

コンパイラは、myClass を unsafe_unretained にする必要があると判断します。そして、私がこれを試してみると:

-(id) initWithClass: (Class) passedInClass {
   if ((self = [super init])) {
     self.myClass = passedInClass;
   }
   return self;
}

何が起こるかというと、クラスが呼び出しコードで非 nil であっても、init メソッド内では nil です。

アークをオフにする以外に、これを回避する方法はありますか?

編集:この質問は間違っています。それは機能します。受け入れられた回答を参照してください。

4

1 に答える 1

4

10.7 および 5.1 を対象とする Xcode 4.3.2 で宣伝どおりに動作します。

@interface MOYNObject : NSObject
@property (nonatomic, strong, readwrite) Class myClass;
@end

@implementation MOYNObject
@synthesize myClass;

- (id)initWithClass:(id)pClass
{
    self = [super init];
    if (self != nil)
        self.myClass = pClass;
    assert(self.myClass);
    CFShow((__bridge const void*)self.myClass);
    return self;
}

@end

int main(int argc, const char* argv[]) {
    @autoreleasepool {
        MOYNObject * o = [[MOYNObject alloc] initWithClass:[NSString class]];
        // ...
    }
    return 0;
}

4.3.2 より進んでいますか、それとも遅れていますか?

于 2012-04-26T04:18:23.397 に答える