Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么使用_弱不会导致局部变量立即为零?_Iphone_Objective C_Ios_Automatic Ref Counting - Fatal编程技术网

Iphone 为什么使用_弱不会导致局部变量立即为零?

Iphone 为什么使用_弱不会导致局部变量立即为零?,iphone,objective-c,ios,automatic-ref-counting,Iphone,Objective C,Ios,Automatic Ref Counting,我已经在同一个项目上工作了一段时间,随着时间的推移,我对Objective-C和Cocoa的理解也有了一些变化。回顾代码的某些部分,我发现: __weak ASIFormDataRequest *serverQueueRequest = [ASIFormDataRequest requestWithURL:url2]; [serverQueueRequest setCompletionBlock:^{ NSLog(@"%@", serverQueueRequest.responseStr

我已经在同一个项目上工作了一段时间,随着时间的推移,我对Objective-C和Cocoa的理解也有了一些变化。回顾代码的某些部分,我发现:

__weak ASIFormDataRequest *serverQueueRequest = [ASIFormDataRequest requestWithURL:url2];
[serverQueueRequest setCompletionBlock:^{
    NSLog(@"%@", serverQueueRequest.responseString);
}];
[serverQueueRequest startAsynchronous]; 
这就是我处理所有服务器请求的方式。我想我这样做是为了抑制一个警告,即“在块中捕获请求可能导致一个保留周期”。所以我让它变弱了,这似乎解决了我所有的问题。我没有注意到这有什么真正的问题

然而,现在看看代码,它的工作似乎有点奇怪。当我将请求声明为
\uu-weak
时,它是否应该立即归零,因为没有人持有它?为什么这个代码可以工作

另外,虽然这段代码可以工作,但我最近发现了一个不可以的情况:当连续多次调用包含这段代码的方法时,比如说在一秒钟内调用5次,3/5请求将有
NULL
响应。情况始终如此。删除
\u弱
限定符可以解决此问题。这有什么解释

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

更新:根据,正确的方法如下:

ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...
__weak ASIHTTPRequest *request = _request;
编辑:实际上,上面的修复并没有修复调用代码5次会导致空响应的问题。这个问题仍然存在。解决这个问题的唯一方法是强烈捕获请求,而不使用任何限定符

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

引用发行说明:

在堆栈上使用弱变量时要小心。考虑一下 以下示例:

虽然字符串是在初始赋值之后使用的, 在创建时,没有其他对字符串对象的强引用 分配因此,它立即被解除分配。日志语句 显示该字符串具有空值


我相信这是因为你在块中运行弱变量。块保持弱变量的状态,从而使其工作。我打赌,一旦块完成,变量上的大量工作可能会导致问题


我猜测,如果您多次运行它,它为什么会失败,是因为异步asi调用堆栈变得越来越高。我以前见过这种情况,如果你非常耐心,你可以在调试器中发现asi爆炸

obj C堆栈将始终在作用域中保留指针_弱并不意味着现在就释放,而是在堆栈超出范围时释放

当您声明一个var,然后在同一堆栈范围内对其进行调用时,它将不会被释放,直到(至少)清理完堆栈


块扩展了方法范围,因为它们意味着潜在的异步行为,并且它们利用了调用它们时出现的堆栈。

没错,但我要说的是,执行上述操作实际上大部分时间都有效,除非在特殊情况下,我以非常快的速度多次运行代码。否则,在典型用法中,请求通过并得到响应。ASIHTTPRequest是否使用ARC?如果不是,它可能在自动释放池中。在这种特殊情况下,它似乎不会立即发布,这并不能证明这是一条规则。ASIHTTPRequest不使用ARC。当它执行时,块不会暂时保留它的内存位置吗?我的观点是,你没有看到弱变量立即变为nil的原因是方法返回的对象是自动释放的。啊,是的,好吧,如果你把这个调用包装在一个自动释放池中,那么你可以测试这个变量是否在池的作用域之外变为零。好主意![注意:在池的作用域之外声明变量,在池内进行调用,在池下记录变量。]这个变量正是我将应用程序转换为ARC后发生的情况。我用以下代码修复了它:`ASIFormDataRequest*request=[AsiformDataRequestRequestWithURL:url]__弱ASIHTTPRequest*weakRequestRef=请求;[请求setPostValue:data forKey:@“data”];//请求完成-通知subcriber[Request setCompletionBlock:^{[self.delegate requestCompleted:[weakRequestRef responseString]];}];
NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]]; 
NSLog(@"string:%@", string);