【问题标题】:Objective-C Blocks - use as an objectObjective-C 块 - 用作对象
【发布时间】:2011-01-13 15:13:48
【问题描述】:

参考下面的代码,一旦一个块被放入一个数组中,你怎么能拿那个块对象并运行块中的实际代码。

另一个问题:如果我在下面这样的块中调用方法,该块是封装该方法中的代码还是捕获该方法的签名并以这种方式调用它?

-(void)blockCalledMethod
{
    NSLog(@"Hello World");
}

-(void)programStart
{       

    NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];    

    id pointerToBlock = [array lastObject];
}

【问题讨论】:

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


    【解决方案1】:

    这样称呼它:

    void (^pointerToBlock)(void) = [array lastObject];
    pointerToBlock(); // because ^ {} is void(^)(void)
    

    如果要直接调用pointerToBlock,则不能将其声明为id,因为编译器必须将其识别为块类型,而不仅仅是一个对象。

    如果我像上面那样在块中调用方法,该块是封装该方法中的代码还是捕获该方法的签名并以这种方式调用它?

    我应该认为self 指的是调用类。

    【讨论】:

    • @BoltClock,我也相信^{}nil 不一样,所以你不能这样测试它的存在,对吗? if (pointerToBlock) 不好?块不是 NSObjects 的子类,尽管它们可以存储在容器中并被视为这样?
    • @Stephen Furlani:我指的是^ {} 作为签名,但是是的,一个块与没有块(nil)不同。根据您的第二个问题,我尝试了 [^ {} isKindOfClass:[NSObject class]] 并且(令我惊讶的是)它返回 YES
    • if (pointerToBlock) 应该可以正常工作。事实上,如果pointerToBlock 为 NULL(与 nil 相同),如果您执行 pointerToBlock(),您将崩溃,这与发送 nil 对象不同,因此您需要在调用块之前执行此检查(如果可以)空。
    • 如果我像上面那样在一个块中调用一个方法,该块是封装了该方法中的代码还是捕获了该方法的签名并以这种方式调用它?
    • self 指的是定义块的对象,即selfprogramStart 方法中的任何内容。请注意,self 在这种情况下被保留,potentially creating a retain cycle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多