-1

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,meth2meth3在收到 3 个特定通知时执行,但它们总是以相同的顺序执行一次。

执行时meth3,我得到[NSPathStore2 UTF8String]: message sent to deallocated instance 0x107eb36a0. 启用 NSZombie 时,Instruments 告诉我这aString是由 libdispatch.dylib 发布的。我可以通过copy'ing aStringinmethod1并在method3. 尽管如此,我认为这不是正确的做法,而且实例变量被 libdispatch 释放似乎很奇怪。谢谢你的帮助。

4

2 回答 2

2

用作aString属性 - self.aString(注意这self.myString = anotherString; 只是 a [self setMyString:anotherString]),因此它将为您保留此字符串(如您在属性声明中提到的),如下所示:

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

每个属性都使用 iVar 备份,因此直接使用 iVar(无点语法)不会调用 setter(也不会为您保留新值)。

在此处查看 Apple Docs

编辑

stringByAppendingPathComponent:是一个工厂方法,所以它会返回一个自动释放的字符串。

于 2013-04-03T16:09:00.083 回答
-1

您正在修改块内的 aString ,因此它的值不会被保留。块执行完成后,您需要使用 __block 保留该值。

于 2013-04-03T16:17:08.023 回答