TestObj
类是一个简单的类,其中有一个名为 doSomethingInBackground
的方法,在该方法中我使用 performSelectorInBackground
方法将其自身置于后台线程睡眠5秒。
@implementation TestObj
- (void)dealloc
{
NSLog(@"%@, is main thread %u", NSStringFromSelector(_cmd), [NSThread isMainThread]) ;
}
- (void)doSomethingInBackground
{
[self performSelectorInBackground:@selector(backgroundWork) withObject:nil] ;
}
- (void)backgroundWork
{
sleep(5) ;
}
@end
我分配并初始化实例,将其发送到 doSomethingInBackground
消息,并将 nil
赋值给它,以便尽快释放它。
TestObj *obj = [[TestObj alloc] init] ;
[obj doSomethingInBackground] ;
obj = nil ;
我发现在执行obj = nil;
约5秒后,dealloc
方法会运行。看起来当系统发送[self performSelectorInBackground:@selector(backgroundWork) withObject:nil] ;
方法时,会保留self
,并且在backgroundWork
返回后,该实例将被释放。
有人能告诉我系统在背后做了什么吗?谢谢。
[weakObj doSometingInBackground]
?目前情况下,创建weakObj
没有什么实际意义,因为它未被使用。 - The Paramagnetic Croissant