2012-04-26 60 views
3

我想要一個類型爲類的ivar,並在指針傳入後保持指針。但無論我做什麼,arc都不會讓我這樣做。例如,如果我聲明Objective C arc - 保持對類的引用

@property (nonatomic, strong) Class myClass; 

編譯器確定myClass應該是unsafe_unretained。如果我試試這個:

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

什麼情況是,即使類是非零調用代碼,它是零init方法中。

關閉弧的缺點,有什麼辦法可以解決這個問題嗎?

編輯:這個問題是錯的。它確實有效。看到接受的答案。

+0

類與ARC不兼容。一些objc對象具有自定義內存管理(即它們覆蓋保留釋放和dealloc),因此不能與ARC一起使用。我不知道是否有他們的名單,但我很確定班是其中之一。我不知道任何解決方案,所以我不會發布這個答案。 – borrrden 2012-04-26 02:35:22

+2

@borrrden ARC處理類指針。 [clang自動引用計數,第3節「可保留對象指針」](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects):「有三種可保留對象指針類型:... Objective-C對象指針(ID,類,NSFoo *等)...「 – 2012-04-26 05:41:20

+0

@robmayoff那麼那麼......我站在更正> _ <。我尋找我在想什麼,現在我意識到我指的是重寫保留或釋放的類不能成爲WEAK引用的目標......所以它完全是一個不同的主題。 – borrrden 2012-04-26 06:51:05

回答

4

像宣傳的那樣在Xcode 4.3.2目標10.7和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; 
} 

您提前或滯後4.3.2?

+0

我在4.3.2; idk爲什麼你的工作和我的不工作。我會調查。 – 2012-04-26 13:01:47

+0

你是對的。我有一個無關的錯誤和曲解。 – 2012-04-26 13:14:22