-1

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];
   });
}

meth1meth2およびmeth33 つの特定の通知を受信したときに実行されますが、常に同じ順序で 1 回実行されます。

meth3実行されると、 が得られ[NSPathStore2 UTF8String]: message sent to deallocated instance 0x107eb36a0ます。NSZombie を有効にすると、Instruments はaStringlibdispatch.dylib によってリリースされたことを通知します。copy. _ aString_ method1_ method3_ それにもかかわらず、私はそれが正しい方法だとは思いません。libdispatch によってインスタンス変数の割り当てが解除されるのは奇妙に思えます。ご協力いただきありがとうございます。

4

2 に答える 2

2

プロパティとして使用aStringします- (これ は単なる であるself.aStringことに注意してください)、次のように(プロパティ宣言で述べたように)この文字列を保持します:self.myString = anotherString;[self setMyString:anotherString]

- (void)setMyString:(NSString *)newString {
    [newString retain];
    [_myString release];
    // Make the new assignment.
    _myString = newString;
}

すべてのプロパティは iVar でバックアップされるため、iVar を直接 (ドット構文なしで) 使用してもセッターは呼び出されません (また、新しい値は保持されません)。

こちらのAppleドキュメントをご覧ください

編集

stringByAppendingPathComponent:ファクトリ メソッドであるため、自動解放された文字列が返されます。

于 2013-04-03T16:09:00.083 に答える
-1

ブロック内で aString を変更しているため、その値は保持されません。ブロックの実行が終了したら、__block を使用して値を保持する必要があります。

于 2013-04-03T16:17:08.023 に答える