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 If you pass |
由次猜测,使用
- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender
方法是会在发出notification的线程里进行函数调用的,
这就解释了为什么开始的程序有问题了,它在子线程里操作UI,这个当然会引起各种问题了。
解决方法就是去掉
performSelectorInBackground这个函数(当时应该就是写错了才用了这个函数吧)。