William Jockusch
William Jockusch

Reputation: 27295

Objective C arc -- keeping a reference to a Class

I want to have an ivar of type Class, and to keep the pointer around after it is passed in. But no matter what I do, arc will not let me do that. For instance, if I declare

@property (nonatomic, strong) Class myClass;

the compiler decides that myClass should be unsafe_unretained. And if I try this:

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

what happens is that even if the class is non-nil in the calling code, it is nil within the init method.

Short of turning off arc, is there any way to get around this?

EDIT: This question is just wrong. It does work. See the accepted answer.

Upvotes: 4

Views: 970

Answers (1)

justin
justin

Reputation: 104698

Works as advertised with Xcode 4.3.2 targeting 10.7 and 5.1:

@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;
}

Are you ahead of or behind 4.3.2?

Upvotes: 4

Related Questions