任何人都可以用示例代码(目标C)解释保留周期吗?我们如何删除保留周期?(带代码)

Mat*_*rix 3 iphone

任何人都可以用示例代码(目标C)解释保留周期吗?我们如何删除保留周期?(带代码或图表).我从理论上讲它,但我从未遇到过这样的程序?我很好奇,如何保留周期解决(使用代码或图表)?

Mik*_*ler 6

委托是一个示例,您必须通过assign在委托属性上使用该属性来避免保留周期.例如,您有一个父对象,它创建一个子对象:

self.child = [[[Child alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

因此父级具有对子级的保留引用(因为属性setter保留了它).

现在,父级将自己设置为子级的委托:

self.child.delegate = self;
Run Code Online (Sandbox Code Playgroud)

现在,如果孩子保留其delegate财产,则存在保留周期.两者都包含对另一个的引用,不能被释放.

为避免这种情况,子进程使用以下assign属性声明delegate 属性:

@property (nonatomic, assign) id delegate;
Run Code Online (Sandbox Code Playgroud)

这是安全的,因为委托人几乎总是比委托人长.如果没有,父进程应该在子进程消失之前将其设置为nil.