Objective C arc -- keeping a reference to a Class

automatic-ref-counting, ios, objective-c

Solution

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?

Problem

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.

Original source