今天写了一天的iphone程序,被iphone sdk发短信的功能折磨了一天, 苹果允许的发短信支持貌似仅限于sms://这样的url,这样做每次程序都要被迫中断,实在不爽,查阅了大量文档发现只有使用private framework才能自由的发送短信,而这又是苹果不允许的,不知道苹果下一版的sdk能否适当开放下短信发送的限制。

郁闷之余还是有所收获,那就是感叹object c这门语言在动态性方面确实牛逼,要不是之前用过python、lua这样完全动态语言,真要被这种语言的动态性折服,难怪jobs放言object c是王道,并声称object c才是开发mac、iphone程序的首选, 先来说说最大的感叹之处, 那就是object c可以在不修改原始代码的情况下,往原类中添加新的成员方法,例如:

在string.h中有如下定义:

@interface string {

}

- (const char*) asUtf8;

@end

现在有需求,需要扩展string类的功能,加入asGbk方法,但string类不是我们自己写,我们一般的做法是继承一个mystring,或者写一个utility函数,完成这种转换,但在object c中,可以这样写

新建stringex.h,如下定义:

@interface string (stringex )

- (const char*) asGbk;

@end

使用时记得#import “stringex.h“ 就可以了。

这样语法我在object c的手册里没有找到具体如何称呼(也可能视而不见,请各位指点),我暂且称之为编译期插入成员方法。

上面的语法,还可以成为sugar,毕竟这是在编译期完成的(难为gcc了),不过下面的语法则是完全动态。

在object c里,所有成员方法的调用都是发送消息-即所有方法的调用都是动态的,而object c为此也引入了一个难看的语法,如:

string* str = [string alloc]; //这里含义是调用string的静态方法alloc,string::alloc()

注意,alloc在上面定义中并不存在,但这样写不会error,而是warning,说明编译期不依赖alloc函数必须存在。

const char* utf8 = [str asUtf8]; //这里是调用方法asUtf8, str->asUtf()

有了这样的语法支持,那么就可以实现很多传统c++无法实现的设计模式,比如代理/协议模式, 目标/动作模式,这些模式在iphone sdk中随处可见。

最后再引出object c泛型支持就最自然不过了,再object c中id类型可以被赋值任何数据,类似与d语言auto,或者干脆就是python等脚本语言变量,例如:

id str = [string alloc];

const char* utf8 = [str asUtf8];

最后说下多态, 在c++中, 多态是指运行时确定的成员方法, 但c++中的动态仅限于继承树上的类, 所有类指针存在is a关系, 而object c显然没有这样限制, 比如circle和rectangle都有display方法, 但明显rectangle和circle没有继承关系, 在c++中, 这样的类是不存在多态调用的, 但object c可以, 例如:

circle* c=[circle alloc];

rectangle* r=[rectangle alloc];

id shape = i==1?c:r;

[shape display];

说说Object c的动态性相关推荐

  1. 如何将键/值对添加到JavaScript对象?

    这是我的对象文字: var obj = {key1: value1, key2: value2}; 如何向对象添加{key3: value3} ? #1楼 您可以使用其中任何一个(提供的key3是您要 ...

  2. Java 编程的动态性,第 8 部分: 用代码生成取代反射--转载

    既然您已经看到了如何使用 Javassist 和 BCEL 框架来进行 classworking (请参阅 本系列以前的一组文章), 我将展示一个实际的 classworking 应用程序.这个应用程 ...

  3. Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码--转载

    在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码--使用 Apache Byte Code Engineering Library (BC ...

  4. Java编程 的动态性,第 2部分: 引入反射--转载

    在" Java编程的动态性,第1部分,"我为您介绍了Java编程类和类装入.该篇文章介绍了一些Java二进制类格式的相关信息.这个月我将阐述使用Java反射API来在运行时接入和使 ...

  5. Java 编程的动态性 第1 部分: 类和类装入--转载

    原文地址:http://www.ibm.com/developerworks/cn/java/j-dyn0429/ 本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性的一系 ...

  6. Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持

    Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(          ) A Java反射主要涉及的类如C ...

  7. 菜鸟学习笔记:Java提升篇12(Java动态性2——动态编译、javassist字节码操作)

    菜鸟学习笔记:Java提升篇12(Java动态性2--动态编译.javassist字节码操作) Java的动态编译 通过脚本引擎执行代码 Java字节码操作 JAVAssist的简单使用 常用API ...

  8. 菜鸟学习笔记:Java提升篇11(Java动态性1——注解与反射)

    Java提升篇11(Java其它高级特性--注解与反射) 注解(Annotation) JDK内置注解 自定义注解 元注解(meta-annotation) 反射(reflection) 动态语言 反 ...

  9. [Object]面向对象编程(高程版)(二)原型模式

    [Object]面向对象编程(高程版)(二)原型模式 博客分类: Web前端-JS语言核心 作者:zccst 三.原型模式 每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个 ...

最新文章

  1. libusb中的热插拔使用举例
  2. 大一计算机期末考试高数试卷,高等数学大一期末试卷(A)及答案
  3. 把二元查找树转变成排序的双向链表(树)
  4. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导
  5. python脚本批量生成数据
  6. 23天的单车旅行,从广州到四川,篇首语
  7. idea本地跑如何看gc日志_线上故障如何快速排查?来看这套技巧大全
  8. gitee怎么仓库间传文件_实现一个简单的基于码云(Gitee) 的 Storage
  9. lnmp基于fastcgi实现nginx_php_mysql的分离_LNMP基于FastCGI实现Nginx,PHP,MySQL的分离
  10. CentOS 5 上安装git
  11. 菜鸟学了SpringBoot后,撸了个博客项目(大神跳过哈)
  12. oracle报sp20042,oracle中ora-04301故障处理
  13. 让基础设施代码化更加容易,pulumi 都做了些什么?
  14. fastq质量值_高通量测序数据的质量控制FastQC
  15. vue项目history路由的配置
  16. 嵌入式linux 内核移植篇
  17. 拉普拉斯(逆)变换的计算
  18. 网络其他计算机无法访问,win7局域网别人无法访问我的电脑是为什么 win7其他电脑无法访问我的电脑如何修复...
  19. html 复选框事件,HTML复选框选中与未选中触发事件的方法
  20. mybatis基础(下)

热门文章

  1. donate.ouyangsong.com
  2. 计算机键盘的功能键在哪,台式电脑home键在哪里(有关电脑按键作用介绍)
  3. 高斯-约当消元法(随机程序,UVA 10828)
  4. JVM 判断对象已死,实践验证GC回收
  5. 艾司博讯:拼多多批量发货怎么做?
  6. MFC Windows 程序设计[五十六]之开启子对话框(附源码)
  7. FTDI(FT220XQ)(一)——USB转SPI芯片的使用之驱动安装及设备信息配置
  8. 安卓Android手机直播推送同步录像功能设计与实现源码
  9. Generalized Function Pointers
  10. 解决垃圾小米文件管理器删除文件后存储空间不变,内存不变大,不释放空间。解决方法:点图中那个结束运行,再重新打开软件(直接滑动退出后台无效果)