WEB开发网
开发学院手机开发iPhone 开发 iPhone 开发入门——从 C/C++ 语言到 Objective-C... 阅读

iPhone 开发入门——从 C/C++ 语言到 Objective-C 语言

 2010-02-22 06:15:00 来源:WEB开发网   
核心提示:执行利用函数指针,调用方法的实现,iPhone 开发入门——从 C/C++ 语言到 Objective-C 语言(7),这时,第一个参数是对象实例,为了验证 Objective-C 编译的二进制文件是否包含符号信息,这里用 nm 命令来查看,第二个是 selector,传送返回值利用 objc_msgSend API

执行

利用函数指针,调用方法的实现。这时,第一个参数是对象实例,第二个是 selector。

传送返回值

利用 objc_msgSend API 经方法的返回值传送回去。

简单地从上面发送消息的过程可以看到,最终还是以函数指针的方式调用了函数。为什么特意花那么大的功夫绕个大圈子呢?

这些年,随着程序库尺寸的扩大,动态链接库的使用已经非常普遍。就是说,应用程序本身并不包括库代码,而是在启动时或者运行过程中动态加载程序库。这样一来一方面可以减小程序大小,另一方面可以提升了代码重用(不用再造轮子)。但是,随之带来了向下兼容的问题。

如果程序库反复升级,添加新的方法的时候,开发者与用户间必须保持一致的版本,否则将产生运行时错误。一般,解决这个问题是,调用新定义的方法的时候,实现检查当前系统中是否存在新方法的实现。如果没有,跳过它或者简单地产生警告信息。 Objective-C中的respondsToSelector:方法就可以用来实现这样的动作。

但是,这并不是万全的解决方案。如果应用程序与新的动态程序库(含有新定义的API)一起编译后,新定义的API符号也被包含进去。而这样的应用程序放到比较旧的系统(旧的动态程序库)中运行的时候,因为找不到链接符号,程序将不能启动。这就是 win32系统中常见的「DLL地域」。

为了解决这个问题,Objective-C 编译得到的二进制文件中,函数是作为 selector 来保存的。就是说,不管调用什么函数,二进制文件中不会包含符号信息。为了验证 Objective-C 编译的二进制文件是否包含符号信息,这里用 nm 命令来查看。

源代码如下 :

int main (int argc, const char * argv[])

{

NSString* string;

int length;

string = [[NSString alloc] initWithString:@"Objective-C"];

length = [string length];

return 0;

}

这里调用了 alloc、initWithString:、length 等方法。

% nm Test

U .objc_class_name_NSString

00003000 D _NXArgc

00003004 D _NXArgv

U ___CFConstantStringClassReference

00002b98 T ___darwin_gcc3_preregister_frame_info

U ___keymgr_dwarf2_register_sections

上一页  2 3 4 5 6 7 8  下一页

Tags:iPhone 开发 入门

编辑录入:coldstar [复制链接] [打 印]
赞助商链接