iPhone学习笔记 Runtime初探初学者必看 #import

iPhone学习笔记 Runtime初探初学者必看 是本文要介绍的内容,runtime通常我们翻译成运行时,其实就是程序运行的时候才加载执行。

程序分为几个状态,编辑时-> 编译时(这时候就会到程序中检查是否有语法错误等相关的错误)-> 静态时-> 运行时

比如有些错误在编译的时候是不会出现的,就是程序在语法上没有问题。但在运行时,因为缺少资源等因素可能出现运行时错误。叫做runtime   error!

比如我们之前我们了解的

C运行时::C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,

不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数。

所以每一次在文件中你要使用runtime的方法的时候都要确认是否已经 #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的时候在去判断时候有存在这个方法,要是有我们就执行屏蔽

代码实例:

  1. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender  
  2. {  
  3.     id menu = objc_msgSend(NSClassFromString(@”UIMenuController”),NSSelectorFromString(@”sharedMenuController”));
  4. //或者方法调用respondsToSelector来判断是否有存在setMenuVisible的方法  
  5.     if (menu)  
  6.     {  
  7.         objc_msgSend(menu,NSSelectorFromString(@”setMenuVisible:”),NO);  
  8.     }  
  9.     return NO;  
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s