多线程总结

多线程总结_第1张图片
- (void)download:(NSString *)url
{
    NSLog(@"下载东西---%@---%@", url, [NSThread currentThread]);
}

/**
 * 创建线程的方式3种
 */
- (void)createThread
{
  1、  NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:@" http://b.png"];
    thread.name = @"下载线程";
    [thread start]; // 启动线程(调用self的download方法),一旦调用start,就把该线程对象放入线程池
 
  2、 [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@" http://a.jpg"];
 
  3、 [self performSelectorInBackground:@selector(download:) withObject:@" http://c.gif"];
}
 
二、常见方法
1> 获取当前线程
+  (NSThread *) currentThread;
2> 获取主线程
+ (NSThread *)mainThread;
3>睡眠(暂停)线程
+(void)sleepUntilDate:(NSDate *)date;
+  (void) sleepForTimeInterval:(NSTimeInterval)ti;
4>设置线程的名字
- (void)setName:(NSString *)n;
-   (NSString *) name;
 
三、线程同步
1.实质:为了防止多个线程抢夺同一个资源造成的数据安全问题
2.实现:给代码加一个互斥锁(同步锁)
@synchronized(self) {
 
}
 
四、线程通信
 // 4.回到主线程,刷新UI界面(为了线程安全)
    [self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];
//    [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
//    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
 
五、GCD
// dispatch_sync : 同步,不具备开启线程的能力
// dispatch_async : 异步,具备开启线程的能力

// 并发队列 :多个任务可以同时执行
// 串行队列 :一个任务执行完后,再执行下一个任务

// Foundation :  OC
// Core Foundation : C语言
// Foundation和Core Foundation框架的数据类型可以互相转换的

//NSString *str = @"123"; // Foundation
//CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation
//NSString *str3 = (__bridge NSString *)str2;
//    CFArrayRef ---- NSArray
//    CFDictionaryRef ---- NSDictionary
//    CFNumberRef ---- NSNumber

// Core Foundation中手动创建的数据类型,都需要手动释放
//    CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);
//    CFRelease(array);
//
//
//    CGPathRef path = CGPathCreateMutable();
//    CGPathRetain(path);
//
//    CGPathRelease(path);
//    CGPathRelease(path);
/**
 凡是函数名中带有create\copy\new\retain等字眼, 都应该在不需要使用这个数据的时候进行release
 GCD的数据类型在ARC环境下不需要再做release
 CF(Core Foundation)的数据类型在ARC\MRC环境下都需要再做release
 */
    // 获得全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 1.创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue", NULL);
 // 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行)
    dispatch_queue_t queue = dispatch_get_main_queue();
    
知识点:
// 需要设置按钮的image和backgroundImage,建议先把按钮类型改为custom,才能保证设置成功
// 属性名不能以new开头
// 只有在init开头的构造方法中,才允许对self进行赋值
 
 
Xib的加载
  // 控制器默认会自动找对应的xib来创建view
    // 1.去掉Controller这个单词后的同名的xib:HMHomeView.xib
    // 2.完全同名的xib:HMHomeViewController.xib
    // 3.自己创建新的View
 
   
 

你可能感兴趣的:(多线程总结)