2016-11-11 ALEX LIN
更新日志 第1章 熟悉 Objective-C 第1条 了解 Objective-C 语言的起源 Objective-C 为C语言添加了面向对象特性,是其超集。Objective-C 使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。接收一条消息之后,究竟应执行何种代码,由运行期环境而非编译器来决定。 理解C语言的核心概念有助于写好Objective-C程序。尤其要掌握内存模型与指针。 第2条 在类的头文件中尽量少引入其他头文件 除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明来提及别的类,并在实现文件中引入那些类的头文件。这样做可以尽量降低类之间的耦合。 有时无法使用向前声明,比如要声 继续阅读 »
2016-10-26 ALEX LIN
更新日志 Method Swizzle(方法调配、方法混合、方法调和、方法混写) 是 Objective-C 运行时的黑魔法之一。我们可以通过 Swizzle 的手段,在运行时对某些方法的实现进行替换,这是 Objective-C 甚至说 Cocoa 开发中最为华丽,同时也是最为危险的技巧之一。Swizzle 使用了 Objective-C 的动态派发,对于 NSObject 的子类是可以直接使用的。 通过此方案,可以为那些『完全不知道其具体实现的』黑盒方法增加日志记录功能,这非常有助于程序调试。然而,次做法只在调试程序时有用。很少有人在调试程序之外的场合用上述『Method Swillze』来永久改动某个类的功能。不能仅仅因为 继续阅读 »
2014-04-27 Xiaosong Gao
Objective-C是一门简单的语言,95%是C语言。只是在语言层面上加了些关键字和语法。真正让Objective-C如此强大的是它的运行时。它很小但却很强大。它的核心是消息分发。 runtime是开源的。可以去下载:http://opensource.apple.com/tarballs/objc4/objc4-437.1.tar.gz。 runtime是由C语言实现的。 runtime的两个版本。 继续阅读 »
2014-09-13 Xiaosong Gao
本文主题是如何动态获取实例属性的值。 Objective-C运行时库已经有这样的功能。使用这些方法需要加头文件。 ``` import ``` 要用到的方法是: objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) 继续阅读 »
2014-04-26 Xiaosong Gao
我们可以在Objective-C运行时将一个类中的一个方法,动态的替换为该类中的另一个方法。并且在替换后的方法中,依然可以调用以前的方法。 ``` import void MethodSwizzle(Class aClass, SEL orig_sel, SEL alt_sel) { Method orig_method = nil, alt_method = nil; // First, look for the methods orig_method = class_getInstanceMethod(aClass, orig_sel); alt_method = class_getInstanceMet 继续阅读 »
2017-08-31 ALEX LIN
更新日志 分析工具:clang ``` clang -rewrite-objc test.m // UIKit clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxxxx.m ``` block 的数据结构定义 对应的结构体定义如下: ``` struct Block_descriptor { unsigned long int reserved 继续阅读 »
2014-04-25 Xiaosong Gao
说明 类别名可以随便取。 类别是一个类,它是添加了新功能的现有类。 使用类别就是为了能够为现有类添加新的方法,不用继承该现有类,就可使用现有类的对象调用添加的方法了。 类别可以使类的实现分散在多个文件中。 类别中不能有变量,类别中没有放变量的位置。 如果类中的方法和类别中的方法名称相同,这将造成冲突,类别的方法将完全取代类的方法。 同一个类的不同类别声明了相同的方法,这将导致不稳定,哪个方法会被调用是不确定的。 不建议在类别中覆盖类中的方法,因为在类别中的方法不能调用superClass的方法(因为没有元数据支持)。 类别方法不能覆盖于同一个类的其它类别中的方法。因为无法预知他们的加载优先顺序,就可能在编译时出错。 对类库的类别方 继续阅读 »
2016-06-27 zzyhappyzzy
注意 本文转载自http://nshipster.cn/clang-diagnostics/ 概要 诊断结合了逻辑与分析来得出一个结论。这是最纯粹的科学和工程学,也是人类最有力的推理。 more 在医学界,诊断是通过实验室样本做后盾的本能来判断。而对于工业制造,则是通过在统计和方向都等同应用来诊断产品故障。 对于我们开发者来说,我们通过代码通知后续代码的生产,创建了一个在过去半个世纪里呈几何级数发展的技术的正反馈循环。尤其对于我们的 Objective-C 开发者来说,最有效的诊断来自 Clang。 Clang 是 C / Objective-C 的前端的 LLVM 编译器。它对 Objective-C 的语义和语法有 继续阅读 »
2016-04-12 ALEX LIN
更新日志 程序员要提高自己的编程能力,有两个捷径:一、多写代码不断做个人项目;二、多看多学习别人的代码,看代码要比写代码难很多倍。 more Objective-C 开源中国 项目地址 继续阅读 »
2014-08-02 Xiaosong Gao
Cycript:Objective-JavaScript,它懂Objective-C,也懂JavaScript。 我们能够借助Cycript使用Objective-C或者JavaScript,给某个正在运行的进程的Runtime发送消息。 继续阅读 »