iOS Sharing 系列
目录
1. Category、 Extension和继承的区别?
2. isKindOfClass、isMemberOfClass作用分别是什么?
3. 开发中逆向传值的方式有哪些?
4. 开发中方法延迟执行的方式有哪些?
5. +load 和 +initialize 的区别是什么?
1. Category、 Extension和继承的区别?
Category
有名字,Extension
没有名字,是一种特殊的Category
。Category
只能扩展方法(属性仅仅是声明,并没真正实现),Extension
可以扩展属性、成员变量和方法。- 继承可以增加,修改或者删除方法,并且可以增加属性。
2. isKindOfClass、isMemberOfClass作用分别是什么?
isKindOfClass
:作用是某个对象属于某个类型或者继承自某类型。isMemberOfClass
:某个对象确切属于某个类型。
//Dog继承自Animal
Animal *a = [Animal new];
Dog *d = [Dog new];
NSLog(@"%d",[a isKindOfClass:[Animal class]]); //1
NSLog(@"%d",[a isMemberOfClass:[Animal class]]); //1
NSLog(@"%d",[d isKindOfClass:[Animal class]]); //1
NSLog(@"%d",[d isMemberOfClass:[Animal class]]); //0
NSLog(@"%d",[d isKindOfClass:[Dog class]]); //1
NSLog(@"%d",[d isMemberOfClass:[Dog class]]); //1
Warning:
不要对NSArray、NSString等Apple实现的类进行isMemberOfClass
操作,得出的结果是false
。
NSString *s = @"";
NSLog(@"%d",[s isMemberOfClass:[NSString class]]); //0
Apple使用类簇的方式实现的这些类,所以s不是NSString
类的实例。
3. 开发中逆向传值的方式有哪些?
- 代理
- 通知
- 单例
- block
- KVO
4. 开发中方法延迟执行的方式有哪些?
(1)、performSelector
此方法是一种非阻塞的执行方式,未找到取消执行的方法。
[self performSelector:@selector(delayMethod) withObject:nil/*可传任意类型参数*/ afterDelay:1.0];
(2)、NSTimer
此方法是一种非阻塞的执行方式,
取消执行方法:- (void)invalidate;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
(3)、NSThread的sleep
此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。 没有找到取消执行方式。
[NSThread sleepForTimeInterval:1.0];
(4)、GCD
此方法可以在参数中选择执行的线程,是一种非阻塞执行方式。没有找到取消执行方式。
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0/*延迟执行时间*/ * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[weakSelf delayMethod];
});`
5. +load 和 +initialize 的区别是什么?
(1)、+(void)load;
+load 方法是当类或分类被添加到 Objective-C runtime 时被调用的,实现这个方法可以让我们在类加载的时候执行一些类相关的行为。子类的 +load 方法会在它的所有父类的 +load 方法之后执行,而分类的 +load 方法会在它的主类的 +load 方法之后执行。但是不同的类之间的 +load 方法的调用顺序是不确定的。
(2)、+(void)initialize;
+initialize 方法是在类或它的子类收到第一条消息之前被调用的,这里所指的消息包括实例方法和类方法的调用。也就是说 +initialize 方法是以懒加载的方式被调用的,如果程序一直没有给某个类或它的子类发送消息,那么这个类的 +initialize 方法是永远不会被调用的。