午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    說說Objective-C的id及動態(tài)綁定
    來源:易賢網 閱讀:2290 次 日期:2015-04-09 15:59:42
    溫馨提示:易賢網小編為您整理了“說說Objective-C的id及動態(tài)綁定”,方便廣大網友查閱!

    OC動態(tài)綁定很重要的一點在于 OC中有一個非常重要的類型叫 id, id是一個指針, 指向類未知的對象, 指向未知類型或未指定的類型. 實際上OC中的所有指針都是id, 當你將消息發(fā)給一個對象時, 具體執(zhí)行什么代碼直到運行時才會決定. 這被叫做動態(tài)綁定.

    這個特性和其他語言是不一樣的 , 當然你會想到, 如果只在運行時檢測, 那么是否會有安全問題?

    其實不用擔心, 因為大部分寫程序的時候都是用靜態(tài)類型. 少部分時要進行些保護性措施, 這個后面會說.

    比方使用靜態(tài)類型化:

    NSString *s = @“x”; 編譯器編譯的時候就會檢查,如果指向非NSString會給出警告(這也提醒我們要好好對待編譯器的警告)

    id obj = s; id obj是指向任何對象的指針,所以不會產生警告

    這種情況在日常寫代碼中也會隨處遇到, 比如NSArray的方法firstObject的類型就是id:

    @property(nonatomic, readonly) id firstObject

    所以這種時候, 應該加些保護措施. 否則很容易crash !

    另外Stanford slide上的一個Demo:

    @interface Vehicle : NSObject

    -(void)move;

    @end

    @interface Ship : Vehicle

    -(void)shoot;

    @end

    Ship* s = [[Ship alloc] init];

    Vehicle* v = s;

    [v shoot];

    id obj = v;

    [obj shoot];

    其中:

    [v shoot] //編譯錯誤, 這個在Slide中只是個警告, 估計是編譯器版本問題

    [obj shoot] //編譯、運行都正常

    這個Demo其實很好的詮釋了id這個類型的特殊性 .

    Ship s = [Ship alloc] init];創(chuàng)建了s,Vehicle v = s; s仍然是Ship類型,同時v指向s,v雖然是Vehicle指針,但實際在內存中仍然是Ship類型

    id obj = v; obj指向v,v指向s,所以obj實際是指向s的,所以obj是能響應shoot函數的

    v 的指針指向Ship那塊內存,[v shoot]由于受到類型的保護 所以報錯, obj由于是id類型所以一切正常.

    可以輸出剛才三者指向的地址, 都是指向s所alloc的內存區(qū)域的.

    指針指向

    繼續(xù)看下去:

    名單

    NSString* hello = @"hello";

    Ship* helloShip = (Ship *)hello;

    [helloShip shoot];

    更通俗點解釋是: 告訴編譯器NSString就是Ship(只是把編譯器糊弄了) 所以編譯正常, 第三行在運行時,由于那個地址沒有還是為@”hello”, 當真正去shoot時, 它會分派那個shoot, 結果發(fā)送到的地方是個字符串. 導致crash.

    同理, 下面這段代碼可以再體會下:

    NSString* hello = @"hello";

    [hello shoot];

    [(id)hello shoot];

    更多信息請查看IT技術專欄

    更多信息請查看技術文章
    易賢網手機網站地址:說說Objective-C的id及動態(tài)綁定

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
    聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網