簡而言之:爲什麼下面的Objective-C代碼塊不會產生編譯器錯誤/警告?在定義相同的語句中使用變量?
- (void)someMethod:(MyObject *)someArg {
MyObject *t = [self otherMethod:t.property]; // Typo. 't.property' should be 'someArg.property'
[t doSomething];
}
我明白了運行時的行爲,爲「t」分配時實際指向一個無效的內存地址。
例如,上面的代碼線是邏輯上等同於:
MyObject *t;
t = [self otherMethod:t.property];
[t doSomething];
在Java這(如果我沒有記錯)通常會導致編譯器錯誤,因爲變量t保證沒有有效值時property
吸氣劑被調用。 (當然,它有的值,但它不值得擁有。)
我在幾分鐘前遇到了這個問題,花了比我想要的更長的時間來確定問題所在。爲什麼編譯器不會警告(在任一代碼片段中)指針t
在被正確初始化之前正在使用?
Sun的javac編譯器會錯誤的,是的(我想這是有可能找到/創建一個編譯器,這將允許未定義行爲出現,儘管JVM的基於堆棧的字節代碼和Java規範將使那是不太可能的 - 更不用說越野車了;-)。 – 2011-03-20 04:53:02
是的,我很確定這會被Sun的編譯器拒絕。我覺得奇怪的是,在LLVM GCC 4.2中這不是一個錯誤,特別是考慮到它是一個局部變量。 – 2011-03-20 04:58:42