ran*_*its 5 objective-c objective-c-blocks
谁能解释这个块语法是如何工作的?
AStreamBuilder stream_builder = [ [ ^( void )
{
// some more code..
return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ];
} copy ] autorelease ];
return stream_builder;
Run Code Online (Sandbox Code Playgroud)
这个街区的名称是什么?为什么要复制块然后自动释放?我对这里发生的事情感到困惑..据说该块返回AStreamBuilder,但是在块体内它返回一个NSInputStream实例.
任何人都可以打破这个吗?
小智 9
这是块:
^( void )
{
// some more code..
return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ];
}
Run Code Online (Sandbox Code Playgroud)
它没有收到任何参数(因此(void)),它返回一个实例NSInputStream.请注意,它没有"名称" - 与此相同,例如:
[[NSNumber alloc] initWithInt:42];
Run Code Online (Sandbox Code Playgroud)
也没有"名字".
由于在堆栈上创建了块,如果需要返回块,则必须将其从堆栈复制到堆(因此-copy).这是一个拥有的对象; 为了返回一个不属于调用者的对象,该块是自动释放的(因此-autorelease):
[ [ ^( void )
{
// some more code..
return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ];
} copy ] autorelease ];
Run Code Online (Sandbox Code Playgroud)
因此上面的摘录是一个自动释放的块,它从堆栈复制到堆.它被分配给一个变量
AStreamBuilder stream_builder = …
Run Code Online (Sandbox Code Playgroud)
所以它很可能AStreamBuilder是一个typedef没有接收参数并且具有返回类型NSInputStream(或与之兼容的类型)的块.请注意,这AStreamBuilder是块类型,而不是块返回的值的类型.就像是:
typedef NSInputStream * (^AStreamBuilder)(void);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2547 次 |
| 最近记录: |