iOS NSObject在块中初始化后为零

时间:2012-11-26 10:46:00

标签: objective-c ios cocoa-touch cocoa objective-c-blocks

我有一个我在块内创建的NSObject。根据以下代码:

__block NSObject *myObject;

[self myMethod:^{
    myObject = [[NSObject alloc] init];
    ....
}];

if(myObject == nil){
    NSLog(@"Why is my object nil?!");
}

myMethod的定义中,我有以下内容:

  backgroundQueue = dispatch_queue_create("backgroundqueue", NULL);

            dispatch_async(backgroundQueue, 
                           ^{

                               dispatch_async(dispatch_get_main_queue(), 
                                              ^{
                                                  if(block){
                                                      block();//Never called.
                                                  }
                                              });

但是永远不会调用该块。

2 个答案:

答案 0 :(得分:3)

这里的问题是你似乎永远不会执行你实例化myObject的块。例如,运行这个小程序:

#import <Foundation/Foundation.h>

typedef void(^MyTestBlock)(void);

@interface Foo:NSObject
- (id)initWithBlock:(MyTestBlock)aBlock;
- (void)someMethod;
@end

@implementation Foo {
    MyTestBlock _block;
}

- (id)initWithBlock:(MyTestBlock)aBlock {
    self = [super init];
    if( !self ) { return nil; }
    _block = aBlock;
    return self;
}

- (void)someMethod {
    _block();
}

@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        __block NSObject *myObject;

        Foo *myFoo = [[Foo alloc] initWithBlock:^{
            myObject = [[NSObject alloc] init];
        }];
        [myFoo someMethod];

        NSLog((myObject)?@"Your object was created":@"Why is my object nil?");
    }
}

这会将2012-11-26 05:00:58.519 Untitled 2[23467:707] Your object was created打印到控制台。关键是块不会自己执行。在上面的代码中,虽然我们将块设置为类的ivar,但在我们someMethod上调用Foo之前,我们不会执行它。

修改

对您的问题的编辑声明该块不会在发送到主队列的异步调度块的上下文中执行。如果这是命令行应用程序,则必须在dispatch_main()结束时调用main。请参阅man的{​​{1}}页面。这是一个完整的工作命令行应用程序来说明这一点,以及与竞争条件相关的问题:

dispatch_get_main_queue()

答案 1 :(得分:0)

您忘记在myMethod中拨打电话。试试下面的代码。

typedef void(^MyBlock)();

- (void)myMethod:(MyBlock)aBlock
{
    aBlock();
}