跳到主要内容

Object-C数组能添加一个block吗?数组添加一个block之后再取出来,这个block还有用吗?

参考答案:

在Objective-C中,数组(NSArray 或其可变版本 NSMutableArray)可以存储任何类型的对象,包括block。这是因为block在Objective-C中是一种对象类型(自从block literals在iOS 4和Mac OS X 10.6中引入之后)。

因此,你可以将一个block添加到NSMutableArray中,并且之后可以从数组中检索它。检索出来的block仍然是有用的,只要它没有被释放(即没有成为孤立的引用)。

下面是一个简单的例子,展示了如何将block添加到NSMutableArray中,并随后检索和执行它:

// 创建一个可变数组
NSMutableArray *array = [NSMutableArray array];

// 定义一个block
void (^myBlock)(void) = ^{
    NSLog(@"This is the block that was stored in the array.");
};

// 将block添加到数组中
[array addObject:myBlock];

// 从数组中检索block
void (^retrievedBlock)(void) = array[0];

// 执行检索到的block
retrievedBlock(); // 输出: This is the block that was stored in the array.

请注意,当你将block存储到数组中时,你需要确保block的生命周期足够长,以便在需要时可以从数组中检索并执行它。如果block被释放了(例如,它是栈上block且其所在的上下文已经消失,或者它是通过__block捕获的变量且该变量被置为nil),那么尝试执行它将会导致运行时错误。

此外,如果你将block存储在数组中,并希望这个block能够捕获外部变量的值,那么你需要确保这些外部变量在block执行时仍然是有效的。如果block捕获的是对象的弱引用(通过__weak修饰符),并且该对象在block执行之前被释放了,那么block中的弱引用将会是nil。如果你希望block保持对对象的强引用,你应该使用__block修饰符(在MRC下)或者在block内部对对象使用__strong修饰符(在ARC下)。