0
总之,我需要知道我是否能够记录变量的存储类型。需要记录存储类型的局部变量
具体而言,我想记录一个变量是否应用了__block
存储类型修改器。
理想情况下,我在寻找类似:
NSLog(@"storage type: %@", [localVar storageType]);
在你想知道的话,我想我只是想出了一个内存泄漏我已经调试在过去的几天里,我想要测试我的假设是否正确。
我使用ASIHttpRequest与setCompletionBlock
和setFailedBlock
,但我通过我的请求对象,做块的实际设置,像这样一个方便的方法:
- (void)getAllHighlights:success:(ASIBasicBlockWrapper)cb1 fail:(ASIBasicBlockWrapperFail)cb2{
// blah blah blah
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setRequestMethod:@"GET"];
[request setDelegate:self];
[self executeAsynchronousRequest:request onSuccess:cb1 onFail:cb2];
}
然后,executeAsynchronousRequest
设置块和开始请求:
- (void) executeAsynchronousRequest:(ASIFormDataRequest *)request onSuccess:(ASIBasicBlockWrapper)cb1 onFail:(ASIBasicBlockWrapperFail)cb2
{
[request setCompletionBlock:^{
int statusCode = [safeRequest responseStatusCode];
NSString *statusMessage = [self statusErrorMessage:statusCode];
cb1([safeRequest responseString],statusMessage);
}];
[request setFailedBlock:^{
cb2(safeRequest);
}];
[request startAsynchronous];
}
我的直觉告诉我,即使我建立了我的请求对象为__block ASIFormDataRequest *request
,当它的内executeAsynchronousRequest
使用,它的洛杉矶t __block存储类型,因为它只被键入为(ASIFormDataRequest *)request
。
谢谢!
嗯......如果我“重写”我的请求对象里面的executeAsyncRequest像这样:__block ASIFormDataRequest * blockSafeRequest = request;然后在我的块中使用blockSafeRequest,我所有关于ASIHTTPRequest的内存泄漏都消失了。 – djibouti33 2012-04-23 23:03:10
setCompletionBlock和setFailedBlock做一个块的显式副本。这对于为什么使用__block强制执行请求参数以消除泄漏成功有什么影响? – djibouti33 2012-04-23 23:08:13
如果你只是想追踪泄漏,你有没有使用静态分析仪? – 2012-04-24 22:09:24