[問題] 請問如何做動態繫結

看板MacDev作者 (我不為讀者改變作風)時間13年前 (2012/03/06 10:48), 編輯推噓2(203)
留言5則, 2人參與, 最新討論串1/1
Objective-C的說明文件 說如果傳入物件的Method 沒有相關定義 也只是回傳nil物件 不會當掉 但我實際測試的結果剛好相反 我傳入"有定義"的Method 他反而出現紅色驚嘆號 說找不到 當然不是單純的函式呼叫 出現這種問題 那一定是我眼花 有Bug沒找出來 會出現這種問題 是在我使用動態繫結的時候 譬如兩個Class Foo 與 Bar 其中Bar 繼承 Foo 我宣告 Foo *obj = [[Bar alloc]init]; 則我執行 [obj bar /*Bar裡定義的Method*/]; 就會出現紅色驚嘆號 說Class Foo裡找不到這個Method 為避免中文表達不清楚 我使用一簡單程式例子說明 我使用的IDE是XCode4.3 // Foo.h @interface Foo : NSObject @end //Foo.m #import "Foo.h" @implementation Foo @end // Bar.h #import "Foo.h" @interface Bar : Foo - (void)barRun; @end // Bar.m #import "Bar.h" @implementation Bar - (void)barRun{ // NOP } @end 好了 然後我執行以下程式碼 Foo *obj = [[Bar alloc]init]; [obj barRun]; 出現紅色驚嘆號 IDE直接檔掉 說Foo Class裡面找不到barRun這個Method 他那麼雞婆幹嘛 教學文件不是說 找不到Method就回傳nil嗎 ------------------------------------------------------ 不要吹毛求疵 雞蛋裡挑骨頭找程式碼有問題了 這只是隨手打打一個簡單的例子 況且我使用以下方法重新執行barRun 如下 [obj performSelector:@selector(barRun)] 沒有問題 obj在執行時期 真的可以動態繫結到 Bar這個Class 請問 說明文件講的 沒有定義相關Method就回傳nil 這個強大的功能怎麼不見了 請問這是XCode4.3的新功能 避免初心的使用者呼叫未定義的Method嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.139.230

03/06 10:57, , 1F
應該只是因為你沒有include .h檔吧
03/06 10:57, 1F
咦?等一下 我Foo.h 跟Bar.h都加進來了 一樣是這個問題 況且沒加進來的話 早在Foo *obj = [[Bar alloc]init]; 這一行就出錯了 請問是哪個.h檔也要加進來呢 ※ 編輯: wemee 來自: 60.250.139.230 (03/06 11:05)

03/06 11:39, , 2F
因為你用了 ARC 吧。如果是ARC狀態下,compiler 要知道回傳
03/06 11:39, 2F

03/06 11:41, , 3F
什麼,才知道要怎麼管記憶體啊~
03/06 11:41, 3F

03/06 11:42, , 4F
如果你其實是回傳id,但compiler當nil,不處理就會leak
03/06 11:42, 4F

03/06 11:43, , 5F
但如果不是id又去處理,就會crash。compiler沒辦法用猜的
03/06 11:43, 5F
謝謝 原來是ARC的關係 我在該檔案的compiler flag加上-fno-objc-arc 就可以了 變成只有警告而已 只是物件的生命要自己控制好 ※ 編輯: wemee 來自: 60.250.139.230 (03/06 11:58)
文章代碼(AID): #1FLNhk6N (MacDev)
文章代碼(AID): #1FLNhk6N (MacDev)