【问题标题】:Is self retained within this Objective-C block?自我保留在这个 Objective-C 块中吗?
【发布时间】:2011-06-22 01:05:39
【问题描述】:

当我在 Objective-C 中有一个如下所示的块时:

self.request = [[ASIHTTPRequest requestWithURL:...

[self.longPollRequest setCompletionBlock:^{
    NSLog(@"%@", self.request.responseString);
}];

它会保留self 还是明确保留self.request

【问题讨论】:

    标签: iphone objective-c objective-c-blocks


    【解决方案1】:

    正如Block Programming Topics 所说:

    在引用计数环境中,通过 引用时的默认值 块内的Objective-C对象,它 被保留。这是真的,即使你 简单地引用一个实例变量 的对象。标记的对象变量 使用 __block 存储类型 但是,修饰符不会保留。

    如果您在方法的实现中使用块,则规则 用于对象的内存管理 实例变量更微妙:

    如果通过引用访问实例变量,self 是 保留;

    如果您通过以下方式访问实例变量 值,变量被保留。

    您在块中引用了self,所以self 被保留。

    【讨论】:

    • 如果您声明例如__block ASIHTTPRequest *blockRequest = self.request;,然后引用blockRequest,则可以避免保留self。问题是你需要确保当你的块运行时请求没有被释放。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多