2014-03-13 60 views
-1

我有一個關於變量範圍和子類的問題。瞭解子/父實例變量的範圍

我有類似如下:

ParentClass.h

@interface ParentClass : NSObject 

@property (nonatomic, strong, readonly) NSString *myIdentifier; 

- (id)initWithIdentifier:(NSString *)identifier; 

@end 

ParentClass.m

@interface ParentClass() 
@property (nonatomic, strong) NSString *myIdentifier; 
@end 

@implementation ParentClass 

- (id)initWithIdentifier:(NSString *)identifier { 
    if (self = [super init]) { 
     self.myIdentifier = identifier; 
    } 
    return self; 
} 
@end 

ChildClass.h

@interface ChildClass : ParentClass 

- (NSString *)showMeTheIdentifier; 

@end 

ChildClass.m

@implementation ChildClass 

- (NSString *)showMeTheIdentifier { 
    return self.myIdentifier; 
} 

然後我去實現類和我沒有得到任何的編譯器警告,但NSLog的結果是(null)

ViewController.m

... 
ChildClass *c = [[ChildClass alloc] initWithIdentifier:@"abc123"]; 
NSLog(@"What's my identifier? %@", [c showMeTheIdentifier]); 
... 

我在做什麼錯?

感謝

+1

你是否在你的'ParentClass'初始化程序中缺少'self = [super init]'東西,或者爲了簡潔起見,你在問題中忽略了它? – veddermatic

+0

'@property(nonatomic,strong)NSString * myIdentifier;'to .h –

+0

'NSLog(@「Just c:'%@'」,c);'output? – Wain

回答

1

除了這個事實,你有self == [super init]而不是self = [super init]在你的「僞代碼」(你比較self[super init]而不是分配給它的),一切都看起來不錯。如果你在你的實際代碼中使用==,那麼我自己返回nil。您可能想要嘗試記錄實際的子類,並在實例化它之後查看對象是否存在(或設置斷點並檢查調試器)。這會告訴你,如果問題出現在實例化或其他地方。

最有可能的是,在您的實際代碼中有一些導致問題的其他細節。有可能你認爲不相關的東西實際上是問題所在。發佈問題之前,我已經完成了此操作。我試圖削減「殘餘」,最終也解決了這個問題。你可能想嘗試發佈你的實際代碼。

+0

你是對的 - 我可以踢自己。我有一個'if-statment',它阻止了我僞'self.myIdentifier = identifier'的等價語句:head:desk: – Joseph

1

可以刪除財產申報私人類別,做這樣的事情:

您還沒有初始化返回的自我。因此它不起作用。

- (id)initWithIdentifier:(NSString *)identifier { 
    self = [super init]; 
    if(self) { 
     _myIdentifier = identifier; 
    } 
    return self; 
} 
+0

像我評論 - 這不是問題。只是忘了輸入我的僞代碼 – Joseph

+0

哈夫編輯我的答案 –