zoukankan      html  css  js  c++  java
  • iOS开发之NSObject的多线程

    1NSObject的多线程方法用的时候要用@autoreleasepool{}包起来

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

    - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

    苹果底层允许使用performSelectorInBackground方法在后台线程更新UI,强烈不建议这么做!

    在后台线程中通知主线程执行任务的方法:

    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

    wait参数:

    YES:会阻塞住线程,直到调用方法完成

    NO:不会阻塞线程,主线程其他任务会继续执行

    获取线程信息:

    [NSThread currentThread]

    线程休眠:

    [NSThread sleepForTimeInterval:2.0f];

    设置线程休眠了2秒

    特点:

    使用简单,量级轻

    不能控制线程的数量以及执行顺序

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

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

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

    在使用NSObjectNSThread的多线程技术时,如果涉及到对象分配,需要手动添加@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{}包起来。

  • 相关阅读:
    [置顶] 搭建一个流媒体服务器引子
    Exchange Server 2007 常见问题解答(6)
    [置顶] 第九周项目1
    iOS 6应用开发实战
    hdu 1722(数论)
    js二维数组排序
    HDU 4027 线段树 Can you answer these queries?
    Socket编程指南及示例程序
    Spring攻略学习笔记(2.13)解析文本消息
    线性渐变lineargradient和滤镜opacity/filter的透明效果兼容性解决方案及其RGB/RGBA与16进制转换方法
  • 原文地址:https://www.cnblogs.com/lifengfneg/p/4774018.html
Copyright © 2011-2022 走看看