zoukankan      html  css  js  c++  java
  • iOS 小经验:UIAnimation空对象导致crash

    今天调试一个老程序,发现有时运行动画会crash,仔细检查了基本的内存管理,发现都没问题!后来发现了问题,这个程序用的是下面的代码

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

    其中,noticeDrawer函数如下,

    - (void)noticeDrawer

    {

        [[NSNotificationCenter defaultCenter] postNotificationName:kBackToMenu object:nil userInfo:nil];

    }

    这里noticeDrawer函数,发出了一个notification,这个notification的相关函数是一个动画函数。那么在一个子线程里post 一个notification,这个notification的响应函数会在哪个线程里调用呢?

    - (void)addObserver:(id)notificationObserver
               selector:(SEL)notificationSelector
                   name:(NSString *)notificationName
                 object:(id)notificationSender

    函数里,没有找到关于运行线程的描述,但是在另一个方法中:

    - (id<NSObject>)addObserverForName:(NSString *)name
                                object:(id)obj
                                 queue:(NSOperationQueue *)queue
                            usingBlock:(void (^)(NSNotification *note))block

    有如下的描述:

    queue

    The operation queue to which block should be added.

    If you pass nil, the block is run synchronously on the posting thread.

    由次猜测,使用

    - (void)addObserver:(id)notificationObserver
               selector:(SEL)notificationSelector
                   name:(NSString *)notificationName
                 object:(id)notificationSender
    方法是会在发出notification的线程里进行函数调用的,
    这就解释了为什么开始的程序有问题了,它在子线程里操作UI,这个当然会引起各种问题了。
    解决方法就是去掉
    performSelectorInBackground这个函数(当时应该就是写错了才用了这个函数吧)。
  • 相关阅读:
    oracle和mysql功能相同的函数
    五个人二个月为什么不等于十个人一个月
    Oracle—RMAN完全恢复
    UVA 208 Firetruck
    sql server2005 express和Northwind数据库安装
    机器学习理论与实战(十一)关联规则分析Apriori
    JavaScript前世今生
    Maclean Liu对Oracle Database 12c新特性研究汇总
    amcharts报表制作
    HDU 4274 Spy's Work (树 DFS)
  • 原文地址:https://www.cnblogs.com/breezemist/p/4784649.html
Copyright © 2011-2022 走看看