2010-12-16 54 views
1

我想爲我的NSObject派生對象實現Objective-C描述方法。不能在Objective-C描述方法中使用帶有描述名稱的ivar嗎?

但是,我的派生對象具有名稱描述的ivar。由於某種原因,這導致了崩潰。

- (NSString *) description { 

    NSMutableString *output = [NSMutableString string]; 
    [output appendFormat:@"MyObject.description = %@\n", self.description]; 

    return output; 
} 

爲什麼會出現這個問題?

回答

5

答案很簡單:崩潰是堆棧溢出的結果,因爲你-description方法反覆調用自身。要做你想做的事情(從描述方法中訪問伊娃),你應該而不是在伊娃前面使用前綴self.

更多詳情:

在Objective-C,self.description[self description]簡寫。使用點語法通知編譯器,您要訪問名爲description而非屬性的ivar本身。

+0

謝謝,我知道我在做一些愚蠢的事情。 – Shiun 2010-12-16 20:12:52

+0

'這個'?認爲你的意思是'self' ;-)(雖然'this'是C++ equiv,sorta)。 nm,你修復它。 – NSGod 2010-12-16 20:14:52

+0

@NSGod:已經修復,但謝謝你指出。我總是犯這個錯誤。我在C++上削減了我的牙齒,所以'this'自動彈出':)' – 2010-12-16 20:17:30

1

這是一個問題,因爲你正在創建一個無限循環。 self.description會調用[自我描述],這正是你所處的方法。因此你有反覆調用自己的方法。

- (NSString *) description { 

    NSMutableString *output = [NSMutableString string]; 
    [output appendFormat:@"super's description = %@\n", [super description]]; 
    [output appendFormat:@"MyObject.description = %@\n", description]; 

    return output; 
} 

您可以直接訪問實例變量,而不是使用self.description。另外,我添加了一行代碼,以顯示如何調用super的描述方法(不會創建無限循環)。

+0

謝謝!那就是問題所在。 – Shiun 2010-12-16 20:13:46

+0

+1。對['super description]'的調用的好處 – 2010-12-16 20:15:53