2012-04-23 52 views
0

总之,我需要知道我是否能够记录变量的存储类型。需要记录存储类型的局部变量

具体而言,我想记录一个变量是否应用了__block存储类型修改器。

理想情况下,我在寻找类似:

NSLog(@"storage type: %@", [localVar storageType]); 

在你想知道的话,我想我只是想出了一个内存泄漏我已经调试在过去的几天里,我想要测试我的假设是否正确。

我使用ASIHttpRequest与setCompletionBlocksetFailedBlock,但我通过我的请求对象,做块的实际设置,像这样一个方便的方法:

- (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

谢谢!

回答

0

你并没有修改request在一个块中,所以__block不会为你做任何事......如果你传递请求到一个块,它不会被复制,它会保持本地当你将它传递给块时,这个版本是作用域的。

+0

嗯......如果我“重写”我的请求对象里面的executeAsyncRequest像这样:__block ASIFormDataRequest * blockSafeRequest = request;然后在我的块中使用blockSafeRequest,我所有关于ASIHTTPRequest的内存泄漏都消失了。 – djibouti33 2012-04-23 23:03:10

+0

setCompletionBlock和setFailedBlock做一个块的显式副本。这对于为什么使用__block强制执行请求参数以消除泄漏成功有什么影响? – djibouti33 2012-04-23 23:08:13

+0

如果你只是想追踪泄漏,你有没有使用静态分析仪? – 2012-04-24 22:09:24