【iOS Sharing】【10】KVO、消息转发等

本文最后更新于:2021年12月22日 中午

【iOS笔记】系列目录


目录

1、开发中逆向传值的方式有哪些?

2、开发中方法延迟执行的方式有哪些?

3、说一说KVO在重写NSKVONotifying对象的setter方法中,添加了哪两个关键方法?

4、如何实现一个完整的单例?

5、iOS消息转发流程


1、开发中逆向传值的方式有哪些?

  • 代理
  • 通知
  • 单例
  • block
  • KVO

2、开发中方法延迟执行的方式有哪些?

(1)、performSelector

此方法是一种非阻塞的执行方式,未找到取消执行的方法。
1
[self performSelector:@selector(delayMethod) withObject:nil/*可传任意类型参数*/ afterDelay:1.0];

(2)、NSTimer

此方法是一种非阻塞的执行方式, 取消执行方法:`- (void)invalidate;`
1
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

(3)、NSThread的sleep

此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。 没有找到取消执行方式。
1
[NSThread sleepForTimeInterval:1.0];

(4)、GCD

此方法可以在参数中选择执行的线程,是一种非阻塞执行方式。没有找到取消执行方式。
1
2
3
4
5
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];
});`

3、说一说KVO在重写NSKVONotifying对象的setter方法中,添加了哪两个关键方法?

答:
1
2
-(void)willChangeValueForKey:(NSString *)key;
-(void)didChangeValueForKey:(NSString *)key;

4、如何实现一个完整的单例?

答:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#import "SingletonSample.h"

@interface SingletonSample()<NSCopying>

@end

@implementation SingletonSample
+(instancetype)sharedInstance
{
static SingletonSample *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL] init];
});

return instance;
}

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
return [self sharedInstance];
}

-(id)copyWithZone:(NSZone *)zone
{
return self;
}

@end

5、iOS消息转发流程

答:
消息转发机制基本分为三个步骤:
  • 1、动态方法解析
  • 2、备用接受者
  • 3、完整转发

完整代码

流程

类方法:
类方法

实例方法:
实例方法

详细流程:
详细流程

感谢大佬提供的图片。


联系方式

邮箱: xiebangyao_1994@163.com

相关账号: