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{}包起来。

  • 相关阅读:
    eclipse中文乱码问题解决方案
    修改Tomcat的JDK目录
    Tomcat 5.5 修改服务器的侦听端口
    HTML DOM教程 27HTML DOM Button 对象
    HTML DOM教程 24HTML DOM Frameset 对象
    Navicat for MySQL v8.0.27 的注册码
    HTML DOM教程 25HTML DOM IFrame 对象
    Tomcat 5.5 的下载和安装
    android manifest相关属性
    ubuntu10.04 下 eclipse 小结
  • 原文地址:https://www.cnblogs.com/lifengfneg/p/4774018.html
Copyright © 2011-2022 走看看