dispatch_async
我从控制器初始化类 myClass 的对象,然后在 3 个不同的函数中对该对象执行 3 个方法。这是我的班级:
@interface myClass : NSObject
@property (retain) NSString* aString;
-(void)method1;
-(void)method2;
-(void)method3;
@end
@implementation myClass
@synthetize aString;
-(void)method1 {
aString = [NSTemporaryDirectory() stringByAppendingPathComponent:@"my_file"];
[someData writeToFile:aString];
// ...
}
-(void)method2 {
// ...
}
-(void)method3 {
aFunction([aString UTF8String]);
}
@end
和控制器
-(void) viewDidLoad{
myClass* myObject = [[myClass alloc] init];
}
-(void)meth1 {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[myObject method1];
});
}
-(void)meth2 {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[myObject method2];
});
}
-(void)meth3 {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[myObject method3];
});
}
meth1
,meth2
并meth3
在收到 3 个特定通知时执行,但它们总是以相同的顺序执行一次。
执行时meth3
,我得到[NSPathStore2 UTF8String]: message sent to deallocated instance 0x107eb36a0
. 启用 NSZombie 时,Instruments 告诉我这aString
是由 libdispatch.dylib 发布的。我可以通过copy
'ing aString
inmethod1
并在method3
. 尽管如此,我认为这不是正确的做法,而且实例变量被 libdispatch 释放似乎很奇怪。谢谢你的帮助。