iOS开发知识小集

多个Category实现同一方法的调用

多个Category实现同一方法,XCode将根据Compile Sources里文件顺序从上至下编译,编译时通过压栈的方式将多个分类压栈,根据后进先出的原则,后编译的Category会被调用。所以,事实上执行哪个Category的方法与import哪个Category无关。

NSUserDefault setObject:forKey:

苹果文档中描述,在 NSUserDefault 的 setObject:forKey: 方法中,setObject 只能是 property list objects(包括 NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary)。且对于 NSArray and NSDictionary,他们所包含的内容也必须是 property list objects. 但是对于 NSDictionary,如果当它的 Key 不是 string 类型的话,此时这个 dict 就不算是 property-list objects 了,所以它不能往 NSUserDefaults 里面存,否则就会报错。

关于系统framework进行 Method Swizzle 之后,为什么不会修改其他应用的行为

关于系统framework进行 Method Swizzle 之后,为什么不会修改其他应用的行为。framework被编译之后可以分为 _text 段和 _data 段, 其中 _text 段里面就有什么函数代码啊这些,这部分是公用的, 对于_data段里面非const的内容, 每个程序会有一份独立的拷贝,这里面其实还有系统优化。而Swizzle用的method_exchange函数交换的class的struct结构里面的methodlist,恰巧_objc_classlist这个包含methodlist的section就在data段(有兴趣看看mach-o结构,还比较有意思),这部分是可以被修改的,并且独立的,所以这样就实现了修改动态库class结构,只会对当前应用生效 关于framework共用内存和非共用再cocoa framework guide line里面有提到, 大意就是说cocoa framework的开发者,mac平台上你能用const的地方就,就多用const, 不然别人用了你的framework会多占用内存的。

[self class]和object_getClass(self)的区别

源于在一次使用 Method Swizzle 的时候,传入 Class 参数使用了 [self class]object_getClass(self) 两种不同的方式时产生两种不同结果的思考。

1、 在项目使用 object_getClass(self) 成功,而使用 [self class] 失败。
2、 在UnitTest中使用 [self class] 成功,而使用 object_getClass(self) 失败。

基于此,我想很有必要深入探究一下 [self class]object_getClass(self) 这两者的区别。


坚持原创技术分享,您的支持将鼓励我继续创作!
----------- 本文结束, 感谢您的阅读 -----------