• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iphone - 为什么使用 __weak 不会导致局部变量立即为零?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:11:33 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我从事同一个项目已经有一段时间了,随着时间的推移,我对 Objective-C 和 Cocoa 的理解有了一些进步。回顾我的代码的某些部分,我看到了:

__weak ASIFormDataRequest *serverQueueRequest = [ASIFormDataRequest requestWithURL:url2];
[serverQueueRequest setCompletionBlock:^{
    NSLog(@"%@", serverQueueRequest.responseString);
}];
[serverQueueRequest startAsynchronous]; 

这就是我处理所有服务器请求的方式。我想我这样做是为了抑制警告,即“在 block 中捕获请求可能会导致保留周期”。所以我把它变弱了,这似乎解决了我所有的问题。我没有注意到这有什么真正的问题。

但是,现在查看代码,它的工作原理似乎有点奇怪。当我将请求声明为 __weak 时,它不应该立即归零,因为没有人坚持它吗?为什么这段代码有效?

另外,虽然这段代码有效,但我最近发现了一个不起作用的情况:当连续多次调用包含此代码的方法时,比如在一秒钟内调用 5 次,3/5 的请求将有一个 NULL 响应。情况一贯如此。删除 __weak 限定符可解决此问题。对此有何解释?

最后,像这样声明本地请求的正确方法是什么?

更新:根据this question ,正确的做法是这样的:

ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...
__weak ASIHTTPRequest *request = _request;

编辑:实际上上面的修复并没有解决调用代码 5 次导致 NULL 响应的问题。那个问题依然存在。解决问题的唯一方法是强烈捕获请求而不使用任何限定符。

现在的问题是为什么我的原始代码仍然有效..



Best Answer-推荐答案


引自 Apple's Programming with ARC发行说明:

Take care when using __weak variables on the stack. Consider the following example:

NSString __weak *string = [[NSString alloc] initWithFormat"First Name: %@", [self firstName]]; 
NSLog(@"string:%@", string); 

Although string is used after the initial assignment, there is no other strong reference to the string object at the time of assignment; it is therefore immediately deallocated. The log statement shows that string has a null value.

关于iphone - 为什么使用 __weak 不会导致局部变量立即为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12289624/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap