多线程操作之NSObject

来源:互联网 发布:小米手机关闭数据流量 编辑:程序博客网 时间:2024/06/06 22:58

1. NSObject ()   一个多线程操作的分类

     NSObject 多线程 分类里面的方法, 在后面子线程中执行一个操作

     本质是: 帮我们快速创建了一个子线程。把相关操作放到了子线程中执行。

     

     两个方法:

     (1) 开启后台执行任务的方法:

    [self performSelectorInBackground:@selector(blockThread:) withObject:nil];

    (2)开启后台执行任务的方法:

    [self performSelectorOnMainThread:@selector(blockThread:) withObject:nil waitUntilDone:NO];

   wait参数:YES:会卡主线程,直到调用方法完成才会执行其他任务 NO:不会卡主线程,主线程其他任务会继续执行

2.

获取线程信息:

[NSThread currentThread]

线程休眠:

[NSThread sleepForTimeInterval:2.0f];

NSObject多线程的特点:使用简单,量级轻,不能控制线程的数量以及执行顺序

2、NSObject的多线程方法注意事项

(1)NSObject的多线程方法使用的是NSThread的多线程技术。

(2)而NSThread的多线程技术不会自动使用@autoreleasepool。

(3)使用NSObject或NSThread的多线程技术时,如果涉及到对象分配,需要手动添加@autoreleasepool。

3、@autoreleasepool

iOS开发中的内存管理:

(1) 在iOS开发中,并没有JAVA或C#中的垃圾回收机制

(2) 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain、release和autorelease

自动释放池的工作原理:

(1)标记为autorelease的对象在出了作用域范围后,会被添加到最近一次创建的自动释放池中

(2)当自动释放池被销毁或耗尽时,会向自动释放池中的所有对象发送release消息

(3)每个线程都需要有@autoreleasepool,否则可能会出现内存泄漏,但是使用NSThread多线程技术,并不会为后台线程创建自动释放池

4、自动释放池常见面试代码

for (int i = 0; i < 10; ++i) {

    NSString *str = @"Hello World";

    str = [str stringByAppendingFormat:@" - %d", i];

    str = [str uppercaseString];

    NSLog(@"%@", str);

}

问:以上代码存在什么样的问题?如果循环的次数非常大时,应该如何修改?

答:循环创建了NSString对象,循环次数过多容易导致内存泄漏。如果循环次数比较大(后一次循环的对象会覆盖掉前一次的对象,然而前一次开辟的空间还在,并且此空间没有指针所以会内存泄露),可以用@autoreleasepool{}把整个循环包起来,如果每一次循环都会导致内存泄漏,则把循环内容用@autoreleasepool{}包起来。

1 0
原创粉丝点击