2016-03-10 43 views
0

我創建一個指針不會創建一個Class對象。 但它可以是發送方法在另一個實例方法中執行。 我認爲只是一個指向對象的指針可以被要求執行一個方法。爲什麼指向沒有對象的指針可以被要求執行setter?

爲什麼「t」可以像這個圖像一樣在方法中使用setter? enter image description here

enter image description here

+1

看到的只是默默地傳遞(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

+3

就在幾年前,我們不得不提醒大家,這隻適用於ARC。在ARC之前的日子裏,'t'將是一個未初始化的變量。 :) – bbum

回答

0

這是因爲只有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響應所有選擇 - 你可以調用無對象的任何可見的方法,你不會得到一個警告也不是錯誤。通過

相關問題