11、runtime消息转发机制
-
runtime的消息转发流程图
-
消息转发的示例
- 这里也给大家推荐一篇比较好的runtime文章。
12、runtime的方法交换&便利归档和解档
- 方法交换实现
+ (void)swizzlingInClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector {
Class clzz = cls;
Method originalMethod = class_getInstanceMethod(clzz, originalSelector);
Method swizzMethod = class_getInstanceMethod(clzz, swizzledSelector);
BOOL didAddMethod = class_addMethod(clzz, originalSelector, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
if (didAddMethod) {
NSLog(@"replace方法成功");
class_replaceMethod(clzz, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
}
else {
NSLog(@"交换方法成功");
method_exchangeImplementations(originalMethod, swizzMethod);
}
}
- 自动归档&解档
- (void)encodeWithCoder:(NSCoder *)aCoder {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([People class], &count);
for (NSUInteger i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivars);
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([People class], &count);
for (NSUInteger i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [aDecoder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}
13、为自己创建的类提供全能初始化方法
- 不管类里面有多少个初始化方法,最终会指向一个全能初始化方法。
- 如果子类和父类的全能初始化方法不一样,就要覆写父类的初始化方法。
- 如果父类的初始化方法不适用于子类,需要把父类的初始化方法覆写,然后抛出异常。
14、尽可能的实现description
方法
- 实现
description
方法,返回一个对该实例对象具有描述意义的字符串。
15、对象尽量为不可变
- 对象创建尽可能为不可变的。
- 对象对外暴露的属性尽可能是
readonly
属性,在对象内部如果要进行修改就在内部把属性修改成readwrite
属性。
16、Objective-C里面的错误处理
- 一般只会在发生严重错误的时候才抛出异常,终止程序。
- 正常情况下我们只需要抛出普通的错误信息,使程序能正常处理普通的错误信息,而不至于让程序崩溃。
17、NSCopying协议的理解
-
浅拷贝:只拷贝对象自身,底层的数据并不会进行拷贝;深拷贝:对象自身和底层数据都进行了一次拷贝。
- 自定义对象如果要实现拷贝功能就需要实现NSCopying协议。
18、Objective-C里面的委托
- 委托的内存修饰使用
weak
,委托的命名方式一般使用“驼峰命名”的方式进行命名。 - 多次判断委托方法是否实现可以使用flag进行标识,以便不用多次进行判断。
19、“大类”通过分类的方式进行切割
- 使用分类进行进行类功能模块的分割,使每个分类都是一个小的功能模块。
- 使用分类机制隐藏不需要公开的使用方法。
20、第三方分类的管理
- 尽量为第三方分类添加专用前缀。
- 尽量为第三方分类里面的方法添加专用的前缀。