dispatch_async
コントローラーからクラス myClass のオブジェクトを初期化し、3 つの異なる関数内でこのオブジェクトに対して 3 つのメソッドを実行します。ここにmyClassがあります:
@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 つの特定の通知を受信したときに実行されますが、常に同じ順序で 1 回実行されます。
がmeth3
実行されると、 が得られ[NSPathStore2 UTF8String]: message sent to deallocated instance 0x107eb36a0
ます。NSZombie を有効にすると、Instruments はaString
libdispatch.dylib によってリリースされたことを通知します。copy
. _ aString
_ method1
_ method3
_ それにもかかわらず、私はそれが正しい方法だとは思いません。libdispatch によってインスタンス変数の割り当てが解除されるのは奇妙に思えます。ご協力いただきありがとうございます。