码迷,mamicode.com
首页 > 其他好文 > 详细

2016 - 1- 21 - RunLoop使用

时间:2016-01-21 19:48:50      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

一:常驻线程 :当需要一个线程一直处理一些耗时操作时,可以让它拥有一个RunLoop。具体代码如下:

   1.通过给RunloopMode里加源来保证RunLoop不直接退出。  

  这里有个很重要得知识点,runloop对象如果mode为空得话,会直接返回。在下面这段代码中的run方法里:

    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];  // 给RunLoop的Mode里添加内容
    
    [[NSRunLoop currentRunLoop] run];// 开启RunLoop,默认是出于Default模式。

  保证RunLoop对象的mode不会为空,也就是不会直接退出,保证线程持续运行。

@interface ViewController ()
@property (nonatomic, strong) ZZThread *testThread;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建自己的线程,并让其执行run方法
    ZZThread *thread = [[ZZThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    self.testThread = thread;
    [self.testThread start];

}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self performSelector:@selector(test) onThread:self.testThread withObject:nil waitUntilDone:NO ];
}
- (void)test{
    NSLog(@"%s ------- %@",__func__,[NSThread currentThread]);
}
// 给线程添加一个RunLoop 让线程"Live"
- (void)run
{
    NSLog(@"%s -------------- %@",__func__,[NSThread currentThread]);
    
    // 如果RunLoop的Mode内没有内容,RunLoop会被直接销毁
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];  // 给RunLoop的Mode里添加内容
    
    [[NSRunLoop currentRunLoop] run];// 开启RunLoop,默认是出于Default模式。
    
    NSLog(@"-------------run end -----------");// 正面run方法一直没有结束
    
}

@end

  2.给Runloop中添加定时器也可以保证RunLoop直接退出。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建自己的线程,并让其执行run方法
    ZZThread *thread = [[ZZThread alloc] initWithTarget:self selector:@selector(test2) object:nil];
    self.testThread = thread;
    [self.testThread start];

}

- (void)test2{
    
    NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
    
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode ];
    
    [[NSRunLoop currentRunLoop] run];
    
}
- (void)test{
    NSLog(@"%s ------- %@",__func__,[NSThread currentThread]);
}

二:自动释放池

  1.RunLoop的自动释放池的生命周期

  技术分享

  RunLoop在开始步骤1时会创建自动释放池,并将之后的需要创建的临时对象都放在池子里,然后在步骤6的时候会将池子销毁,也就是对所有对象做一次realease操作。

也就是说RunLoop每跑一圈,到休眠这个周期里,自动释放池的生命周期同时也是从创建到销毁。

  2.所以在创建RunLoop对象时应该也用一个自动释放池包住

// 给线程添加一个RunLoop 让线程"Live"
- (void)run
{
    @autoreleasepool {
        
        NSLog(@"%s -------------- %@",__func__,[NSThread currentThread]);
        
        // 如果RunLoop的Mode内没有内容,RunLoop会被直接销毁
        [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];  // 给RunLoop的Mode里添加内容
        
        [[NSRunLoop currentRunLoop] run];// 开启RunLoop,默认是出于Default模式。
        
        NSLog(@"-------------run end -----------");// 正面run方法一直没有结束
        
    }

}

 

2016 - 1- 21 - RunLoop使用

标签:

原文地址:http://www.cnblogs.com/BJTUzhengli/p/5148992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!