ARC中的方法中"自我"弱吗?

Sal*_*ule 6 messaging reference-counting objective-c self automatic-ref-counting

我有一种偶尔崩溃的方法.

-(void)foo{
    [self doSomething];
    [self.delegate didFinish];
    [self doSomethingElse];
}
Run Code Online (Sandbox Code Playgroud)

-doSomething工作正常,然后我打电话给委托-didFinish.在-didFinish中,对此对象的引用可能设置为nil,在ARC下释放它.当方法崩溃时,它会在-doSomethingElse上执行此操作.我的假设是自我在一个方法中会很强大,允许函数完成.自我弱还是强?有关于此的文件吗?它的强弱是什么原因?

编辑

在受到以下一些答案的启发后,我做了一些调查.在我的情况下崩溃的实际原因是NSNotificationCenter在任何情况下都不保留观察者.Mike Weller在下面指出方法的调用者应该在调用它时保留对象以防止我上面描述的情况,但是看起来NSNotificationCenter忽略了这个问题,并且始终保持对观察者的弱引用.换一种说法:

-(void)setupNotification{
    //observer is weakly referenced when added to NSNotificationCenter
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleNotification:)
                                                 name:SomeNotification object:nil];
}

//handle the notification
-(void)handleNotification:(id)notification{
    //owner has reference so this is fine
    [self doSomething];
    //call back to the owner/delegate, owner sets reference to nil
    [self.delegate didFinish];
    //object has been dealloc'ed, crash
    [self doSomethingElse];
}
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 9

self在一个方法中很强大,允许函数完成.自我弱还是强?

selfARC既不强也不弱.假设调用者持有引用,并且self不安全.

self可以-dealloc在ARC下使用自己的方法进行编辑,并且它被视为"未定义的行为(或至少是危险的)",以便您的程序执行此操作.

它的强弱是什么原因?

它不具备性能 - 避免(在绝大多数情况下)不必要的引用计数inc/dec.即使他们完成了所有这些额外的引用计数操作,您的程序仍然会在多线程程序中或在存在竞争条件(也是UB)时容易出现此类问题.所以这是他们(正确地)确定他们不需要保护自己的极端边缘案例之一.

有关于此的文件吗?

当然!:)


Mik*_*ler 5

self不弱也不强。如果您可以访问,self那么您就在方法调用的范围内,并且该方法调用正在由某人通过他们必须拥有的引用执行。self只要它在范围内,就暗示它是一个有效的引用,并且暗示任何内存管理或所有权都由调用者处理。

通过弱引用调用方法时,ARC 将在该方法调用期间保留该对象(请参阅此答案)。启用严格的编译器警告后,您实际上将被迫在向该引用发送任何方法之前创建一个强引用。

因此,根据定义,如果在对象上调用方法,则调用者必须已经拥有所有权并且无需执行任何操作。

当然,最终可能会调用解除分配的对象上的方法,但这是错误调用者代码的结果。