如果从Block调用的方法使用self,我是否需要使用弱自指针?

Mob*_*Mon 1 objective-c ios objective-c-blocks retain-cycle

self.在块中使用会导致保留周期,因此我需要创建一个引用weakSelf.我理解这一点

但!

如果从我的块我调用一个使用self" 的方法,这是否也会导致保留周期?例​​如,如果我UITableView从一个块重新加载一个和UITableView我调用的一些委托方法self.,我是否导致保留周期?这是否意味着我必须到处传递这个弱的参考?似乎很好.

CRD*_*CRD 5

我可能会误读你的问题,但你的措辞是:

如果从我的块中我调用一个使用"self"的方法,这是否也会导致保留周期?例如,如果我从一个块重新加载一个UITableView,并在我的一些UITableView委托中调用"self.",那么我是否会导致保留周期?这意味着我必须到处传递这个弱参考?

建议你误解是什么self.希望如果是这样,以下内容将有所帮助而不会阻碍您的理解......

什么是self

标识符self只是方法的一个参数的名称,它只是隐式传递而不是像其他参数一样显式传递.例如,如果你有一个类:

@implementation MyClass

- (void) someMethod:(NSInteger)value
{
   ... self ... value
}

@end
Run Code Online (Sandbox Code Playgroud)

那么这个方法是有效的(即为了清晰起见而稍微弯曲事实):

- (void) someMethod:(NSInteger)value withObject:(MyClass *)self
{
   ... self ... value
}
Run Code Online (Sandbox Code Playgroud)

调用实例方法时,为self参数传递的值是对方法应该操作的实例的引用,例如调用

MyClass *someInstance = ...

[someInstance someMethod:42];
Run Code Online (Sandbox Code Playgroud)

有效的一个调用:

someMethod:42 withObject:someInstance
Run Code Online (Sandbox Code Playgroud)

强参考周期

只要存在对对象的强引用,对象(包括类块的实例)就会保持活动状态.

如果一个对象A在一个对象中拥有一个强引用(例如在一个实例变量或属性中),B那么B只要它还活着,它将至少保持活着(可能有其他强引用B)A.

如果一个对象A拥有一个强引用B并且B保持一个对象A那么你有一个强大的引用循环 - 每个对象保持另一个对象存活,并且都不会被收集.这可能会导致内存泄漏-在未使用的内存空间还没有收集-除非双方AB意味着从创建到生活,直到节目结束.

此外,只需将引用存储在方法的局部变量和参数中,就不会创建强引用循环.就其性质而言,这些变量及其内容是瞬态的,并在方法返回时被破坏.

self在块中使用

使用"自我".在块中会导致保留周期,因此我需要创建对weakSelf的引用.

不完全的.当您self通过引用实例变量直接或间接地在块中使用时,编译器将警告您可以创建引用循环.(注意:还有其他方法可以创建引用周期,包括使用和不使用块,编译器根本不会警告您.管理周期只是您需要注意的事项.)

如果在引用的对象中存储对块的引用,则实际上只会创建一个循环self.然而,这本身并不坏,只要在某些时候你手动打破循环 - 比如通过存储nil在引用块的变量中 - 循环根本不需要有问题.

最后...

你有什么本身不用担心你的:

UITableView委托我称之为"自我".

因为这self只是委托的一个本地参数,它的初始值,在某些时候回到调用链,来自你评估你的weakSelf引用并确定它不是nil,然后调用它的方法.

HTH