0
我創建一個指針不會創建一個Class對象。 但它可以是發送方法在另一個實例方法中執行。 我認爲只是一個指向對象的指針可以被要求執行一個方法。爲什麼指向沒有對象的指針可以被要求執行setter?
我創建一個指針不會創建一個Class對象。 但它可以是發送方法在另一個實例方法中執行。 我認爲只是一個指向對象的指針可以被要求執行一個方法。爲什麼指向沒有對象的指針可以被要求執行setter?
這是因爲只有Xcode的檢查,如果t
變量聲明的類型有一個名爲a
可見的讀寫性能。它不關心t
是否實際上是對象或此時的其他內容。例如,它可以不知道t
是物體或無,或其他任何在這樣的情況下
- (void) method:(One*) t{
t.a = @"Some string";
}
你可以這樣調用
[two method:nil];
的Xcode不會抱怨。你甚至可以做到這一點
One *t = (One *)[[NSObject alloc] init]; //warning here
t.a = @"Some t"; //Xcode doesn't care, that t is actually NSObject and doesn't respond to setA:; But you get a runtime error
在ObjC nil
響應所有選擇 - 你可以調用無對象的任何可見的方法,你不會得到一個警告也不是錯誤。通過
看到的只是默默地傳遞(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/ [用'nil'工作] uid/TP40011210-CH4-SW22)in _Programming with Objective-C,_其中說「如果您沒有其他值使用時,A'nil'值是最安全的方式來初始化對象指針,因爲它在目標中是完全可以接受的-C發送消息給'nil',如果發送消息給'nil',顯然沒有任何反應。「所以,如果't'爲'nil',則發送一條消息(包括調用一個屬性的setter)不會執行任何操作。 – Rob
就在幾年前,我們不得不提醒大家,這隻適用於ARC。在ARC之前的日子裏,'t'將是一個未初始化的變量。 :) – bbum