Objective c 将对象传递回块中

Objective c 将对象传递回块中,objective-c,objective-c-blocks,Objective C,Objective C Blocks,有许多问题和答案是关于如何避免在这样一个块中访问self时保留循环 MYObject *obj = [[MYObject alloc] init]; __weak typeof(obj) weakObj = obj; obj.completionBlock = ^(){ NSLog(@"my message %@", weakObj.message); }; 但是对于像NSTask这样的类,终止处理程序实际上在块回调中包含任务对象 NSTask *task = [[NSTask all

有许多问题和答案是关于如何避免在这样一个块中访问self时保留循环

MYObject *obj = [[MYObject alloc] init];
__weak typeof(obj) weakObj = obj;
obj.completionBlock = ^(){
    NSLog(@"my message %@", weakObj.message);
};
但是对于像NSTask这样的类,终止处理程序实际上在块回调中包含任务对象

NSTask *task = [[NSTask alloc] init];
// Set up task...
task.terminationHandler = ^(NSTask *aTask){
    NSLog(@"Task Launch Path: %@", aTask.launchPath);
};

[task launch];
所以问题是这个对象是如何在内部发送回它自己的? 是对自身的弱引用,还是副本,或是其他不同的东西

 __weak typeof(self) weakSelf = self;
 _terminationHandler(weakSelf);
或者


您唯一需要担心由块引起的保留周期的时间是当块作为闭包捕获块外部的东西时,例如
self
。但在您给出的示例中,未捕获块外部的任何内容:

task.terminationHandler = ^(NSTask *aTask){
    NSLog(@"Task Launch Path: %@", aTask.launchPath);
};
在该块中,您指的不是
任务
——您指的是
任务
。嗯,
aTask
不是块的外部;它是块的内部-它是传递到块中的参数。因此,没有捕获和保留周期:
任务
保留一个
终止处理程序
,它不引用
任务
,因此没有循环的危险。这就是为什么任务会将对自身的引用作为块的参数传递给您,以便您可以引用它


如果您要参考块中的
任务
(而不是
aTask
)并运行分析仪,您肯定会收到一条关于保留循环危险的警告

您唯一需要担心由块引起的保留周期的时候是当块作为闭包捕获块外部的东西时,例如
self
。但在您给出的示例中,未捕获块外部的任何内容:

task.terminationHandler = ^(NSTask *aTask){
    NSLog(@"Task Launch Path: %@", aTask.launchPath);
};
在该块中,您指的不是
任务
——您指的是
任务
。嗯,
aTask
不是块的外部;它是块的内部-它是传递到块中的参数。因此,没有捕获和保留周期:
任务
保留一个
终止处理程序
,它不引用
任务
,因此没有循环的危险。这就是为什么任务会将对自身的引用作为块的参数传递给您,以便您可以引用它


如果您要参考块中的
任务
(而不是
aTask
)并运行分析仪,您肯定会收到一条关于保留循环危险的警告

您唯一需要担心由块引起的保留周期的时候是当块作为闭包捕获块外部的东西时,例如
self
。但在您给出的示例中,未捕获块外部的任何内容:

task.terminationHandler = ^(NSTask *aTask){
    NSLog(@"Task Launch Path: %@", aTask.launchPath);
};
在该块中,您指的不是
任务
——您指的是
任务
。嗯,
aTask
不是块的外部;它是块的内部-它是传递到块中的参数。因此,没有捕获和保留周期:
任务
保留一个
终止处理程序
,它不引用
任务
,因此没有循环的危险。这就是为什么任务会将对自身的引用作为块的参数传递给您,以便您可以引用它


如果您要参考块中的
任务
(而不是
aTask
)并运行分析仪,您肯定会收到一条关于保留循环危险的警告

您唯一需要担心由块引起的保留周期的时候是当块作为闭包捕获块外部的东西时,例如
self
。但在您给出的示例中,未捕获块外部的任何内容:

task.terminationHandler = ^(NSTask *aTask){
    NSLog(@"Task Launch Path: %@", aTask.launchPath);
};
在该块中,您指的不是
任务
——您指的是
任务
。嗯,
aTask
不是块的外部;它是块的内部-它是传递到块中的参数。因此,没有捕获和保留周期:
任务
保留一个
终止处理程序
,它不引用
任务
,因此没有循环的危险。这就是为什么任务会将对自身的引用作为块的参数传递给您,以便您可以引用它



如果您要参考块中的
任务
(而不是
aTask
)并运行分析仪,您肯定会收到一条关于保留循环危险的警告

因此,当作为参数传递到块中时,它不需要是一个
\uu弱
引用,也不需要是一个
副本
,它可以简单地自我确认。仅仅将对象作为参数传递或接收并没有内存管理的含义。如果真是这样的话,你会一直被它弄疯的!你可能想太多了。嘿,马特,谢谢你的回答。如果你不介意用
\u weak
copy
的不必要性质来更新答案,并且你可以简单地使用
self
作为参数,我很乐意在我看来将其标记为“已接受”,我所说的比仅仅谈论“weak”和“copy”以及“self”更深刻、更具教育意义作为一个参数。我试图让你摆脱完全的误解,引导你走上正确的精神道路。如果我失败了,我就失败了。所以,如果你不喜欢我的答案,不要接受;这完全是你的特权。但请不要试图把话塞进我的嘴里或告诉我如何写作。如果这是你对我要求的理解,我真诚地道歉。我最初的问题可能应该更清楚。可能有Q和A在谈论在块内捕获self,但没有一个解决将
self
作为参数传递到块中的特定情况,我担心的是,由于作为参数发送的self与对象相等,因此可能存在对编译器隐藏的底层保留周期。你确实回答了这个问题,这是我提出这个问题的唯一原因