标签:
这里有个很重要得知识点,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
- (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方法一直没有结束 } }
标签:
原文地址:http://www.cnblogs.com/BJTUzhengli/p/5148992.html