IOS总结(三)

1.将一个函数在主线程执行的4种方法

  • GSD方法,通过向主线程·队列发送一个block块,使block里的方法可以在主线程中执行。
dispatch_async(dispatch_get_main_queue(),^{
需要执行的方法
});
  • NSOperation方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];//主队列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlack:^{
需要执行的方法
}];
[mainQueue addOperation:operation];
  • NSThread方法
 [self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];
 [self perfromSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
[[NSThread mainThread] performSelector:@selector(method) withObject:nil];
  • RunLoop方法
[NSRunLoop mainRunLoop]performSelector:@selector(method) withObject:nil];

2.如何让计时器调用一个类方法

  • 计时器只能调用实例方法,但是可以在这个实例方法里面调用静态方法
  • 使用计时器需要注意,计时器一定要加入RunLoop中,并且选好model才能运行。scheduledTimerWithTimeInterval方法创建一个计时器并加入到RunLoop中所以可以直接使用。
  • 如果计时器的repeats选择YES说明这个计时器会重复执行,一定要在合适的实际调用计时器的invalid。不能再dealloc中调用,因为一旦设置为repeats为yes,计时器会强制持有self,导致dealloc永远不会被调用,这个类就永远无法被释放。如果可以在viewDidDisappear中调用,这样当类需要被回收的时候就可以正常进入dealloc中了
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
-(void)timerMethod
{
   调用类方法
   [[self class] staticMethod];

}

-(void)invalid

{

   [timer invalid];

   timer =nil;

}

3.KVO,NSNotification,delegate及block区别

  • KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者。

  • NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,今天范围广,使用也更灵活。

  • delegate是代理,就是我不想做的事情交给别人做。比如狗需要吃饭了,就通过delegate通知主人,主人就会给他做饭、盛饭、倒水,这些操作,这些狗都不需要关心,只需要调用delegate就可以了,由其他类完成所需要的操作。所以delegate是一对一的关系。

  • block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观。

  • KVO一般的使用场景是数据,需求是数据变化,比如股票价格变化,我们一般使用KVO。delegate一般的使用场景是行为,需求是需要别人帮我做意见事情,比如买卖股票,我们一般使用delegate

  • Notification 一般是进行全局通知,比如好消息一出,通知大家去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就需要知道经济人,经济人也不要知道自己的顾客。Notification是弱关联,如果好消息发出,你不需要知道是谁发的也可以做出相应的反应,同理发消息的人也不需要知道接受的人也可以正常发消息

4.如何重写类方法

  • 1.在子类中实现一个同基类名字一样的静态方法
  • 2.在调用的时候不要使用类名调用,而是使用[self class]的方式调用。原理,用类名调用时早绑定,在编译期绑定,用[self class]是晚绑定,在运行时决定调用哪个方法。

5.NSTimer创建后,会在哪个线程运行。

  • 用scheduledTimerWithTimeInterval创建的,在哪个线程创建就会被加入哪个线程的RunLoop中就运行在哪个线程
  • 自己创建的Timer,加入到哪个线程的RunLoop中就运行在哪个线程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 1.1 深拷贝同浅拷贝...
    iYeso阅读 5,867评论 0 13
  • 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。• 深拷贝同浅拷贝的区别:浅拷...
    JonesCxy阅读 4,763评论 1 7
  • • 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向...
    WSGNSLog阅读 5,101评论 0 1
  • 1.OC的类可以多重继承吗?可以实现多个接口吗?要想实现类似多重继承如何实现?答:OC不可以实现多重继承。可以实现...
    欧辰_OSR阅读 6,230评论 0 30
  • 前些日子,还没上学的小外甥忽然热爱上了“聊”微信,当然他的“聊”仅是稀里糊涂打上一行字,然后高兴地发出去,不在意打...
    王单单阅读 3,068评论 0 0