iPhone學習筆記 Runtime初探初學者必看
iPhone學習筆記 Runtime初探初學者必看 是本文要介紹的內容,runtime通常我們翻譯成運行時,其實就是程序運行的時候才加載執(zhí)行。
程序分為幾個狀態(tài),編輯時-> 編譯時(這時候就會到程序中檢查是否有語法錯誤等相關的錯誤)-> 靜態(tài)時-> 運行時
比如有些錯誤在編譯的時候是不會出現(xiàn)的,就是程序在語法上沒有問題。但在運行時,因為缺少資源等因素可能出現(xiàn)運行時錯誤。叫做runtime error!
比如我們之前我們了解的
C運行時::C run-time library里面含有初始化代碼,還有錯誤處理代碼(例如divide by zero處理)。你寫的程序可以沒有math庫,程序照樣運行,只是不能處理復雜的數(shù)學運算,
不過如果沒有了C run-time庫,main()就不會被調用,exit()也不能被響應。因為C run-time library包含了C程序運行的最基本和最常用的函數(shù)。
所以每一次在文件中你要使用runtime的方法的時候都要確認是否已經(jīng) #import <objc/runtime.h>
(存在位置 /usr/include/objc/.)
要不會提示找不到方法
這樣比如你使用runtime的objc_msgsend()的方法的時候它就會編譯通過
那這個runtime的具體的用處是怎樣的
如下
比如你在低版本的sdk(2.x)編譯的程序,然后要屏蔽掉3.x以上的復制黏貼的功能,要是你直接調用方法比如setEnableCop()
這樣你在2.xSDK編譯的時候就會報錯,找不到所謂的方法,因為這個方法是在3.x以上的版本才會提供,在2.x根本找不到,所以方法我們不能直接的調用。
又因為iphone中的方法調用都是通過消息的形式來傳遞的,所以我們就可以跳過編譯的步驟,在程序runtime的時候在去判斷時候有存在這個方法,要是有我們就執(zhí)行屏蔽
代碼實例:
- -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
- {
- id menu = objc_msgSend(NSClassFromString(@"UIMenuController"),NSSelectorFromString(@"sharedMenuController"));
- //或者方法調用respondsToSelector來判斷是否有存在setMenuVisible的方法
- if (menu)
- {
- objc_msgSend(menu,NSSelectorFromString(@"setMenuVisible:"),NO);
- }
- return NO;
- }
小結:iPhone學習筆記 Runtime初探初學者必看的內容介紹完了,希望本文對你有所幫助。以上通過自己摸索,總結的概念,如果不對或不妥的地方請留言,共同學習!