2012-03-09 52 views
0

我有一個NSMutableArray,它返回一些對象。 我添加的對象有屬性名稱,年齡。爲什麼調用NSObject指針的屬性會產生構建錯誤?

現在,當我使用返回的對象(obj.nameobj.age)這些特性, 編譯器說,沒有這樣的成員,使用(->),而不是(.

據我所知,NSObject的不會有這些成員和因此它不會理解這個屬性。

但是,如果我使用setters和getters作爲方法([obj name][obj age])語法而不是此屬性,我沒有得到任何錯誤。

但使用屬性意味着只調用setter或getter?
廣告Objective C假設是動態語言,對吧?

回答

1

沒錯 - 在這種情況下不支持點語法。

你需要一個指針轉換爲實際的類:

((MyObject*)[array objectAtIndex: 0]).name = @"Bill"; 
3

你將返回的對象到對象類型(MyObject)?

你應該這樣做:在使用[[mutableArray objectAtIndex:0] name]語法是你調用返回的對象的方法(這是id型)

((MyObject*)[mutableArray objectAtIndex:0]).age = 20; 

的原因你沒有得到任何錯誤,和id如果你對它們調用(但是)不存在的方法,它們在編譯期間往往不會窒息。在運行時,[mutableArray objectAtIndex:0]可能決定鍵入MyObject,在這種情況下,消息[obj name]具有適當的實現(IMP)。如果它不解析爲MyObject,您的應用程序將崩潰。

而且請注意,你甚至沒有得到一個編譯時警告的原因是,Xcode中知道,有一個在您的代碼庫實現該方法name至少1類,並將其信任你與調用此方法僅該類的實例。如果你做了類似((MyObject*)[mutableArray objectAtIndex:0]).ageeeeee = 20;的東西,它會給你一個警告,因爲它很有可能會崩潰(你的應用中沒有任何類實現方法ageeeeee靜態)。

類型id沒有屬性name,這就是爲什麼你不能使用點語法。

事實上,這個事件顯示了爲什麼ObjC被稱爲動態語言!

+0

這很好。但點語法假設代表對setter或getter方法的調用。所以它不應該以一種方法調用它的方式來調用它是否存在? 反正..謝謝澄清:) – 2012-03-09 05:50:46

+0

如果該財產應該只是只讀?除非編譯器確切地知道你正在談論哪個類/屬性,否則它不知道你是否應該被允許使用它(至少在你想設置值的情況下)。 – UIAdam 2012-03-09 05:55:14

+0

@UIAdam:不錯的一點,但如果屬性是隻讀的,那麼setter不會被生成,並且我應該在運行時得到一個「無法識別的選擇器發送到對象異常」。 – 2012-03-09 06:00:55

相關問題