Objective-C block syntax - can someone explain this?
有人能解释这个块语法是如何工作的吗?
1 2 3 4 5 6 | AStreamBuilder stream_builder = [ [ ^( void ) { // some more code.. return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ]; } copy ] autorelease ]; return stream_builder; |
这里的街区叫什么?为什么要复制块然后自动释放?我对这里发生的事情有点困惑。据说该块返回astreambuilder,但在块体内部它返回nsinputstream的一个实例。
有人能把这个分解吗?
这是块:
1 2 3 4 5 | ^( void ) { // some more code.. return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ]; } |
它不接收任何参数(因此
1 | [[NSNumber alloc] initWithInt:42]; |
也没有"名称"。
由于块是在堆栈上创建的,因此如果需要返回块,则必须将其从堆栈复制到堆栈(因此是
1 2 3 4 5 | [ [ ^( void ) { // some more code.. return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ]; } copy ] autorelease ]; |
所以上面的摘录是一个自动释放的块,它是从堆栈复制到堆的。它被分配给一个变量
1 | AStreamBuilder stream_builder = … |
因此,对于不接收参数并且返回类型为
1 | typedef NSInputStream * (^AStreamBuilder)(void); |
What's the name of the block here?
新块分配给变量
Why is the block being copied and then autoreleased?
因为它将保留在当前作用域之后(从方法/函数返回)。因此需要将它复制到堆中。
the block is said to return AStreamBuilder but inside the body of the block it returns an instance of NSInputStream
您所在的函数/方法(以
正在复制块以将其从堆栈移动到堆。如果要在创建块的作用域之外使用该块,则需要执行此操作。