2011-05-16 64 views
1

考虑下面的代码:如何强制一个未使用的变量成为块的一部分?

- (void)downloadObjectUsingURL: (NSURL *)url; 
{ 
    id file = [self createFileForURL: url]; 
    Finalization objectFinalization = ^() { 
     // we don't access url here, but it would be handy to see it in the debugger 
     [file close]; 
    } 
    id request = [self buildRequestFromURL: url]; 
    [object download: request 
       toFile: file 
     finalization: objectFinalization]; 
} 

什么是强制url被复制为objectFinalization的上下文的一部分最简单的方法,复制并作为objectFinalization更容易调试的目的,一部分通过呢?

我可以想出几个可能的答案,但他们没有一个让我感觉好。我可以做NSLog(@"%@",url),但是会导致喷出。我可以做一个NSAssert(url,...);if (url) {},但这两个都没有真正表达我想要做的事情。

回答

0

年后,我发现了最简单的答案。里面的块,使用:

(void)variable; 

例子:

- (void)downloadObjectUsingURL: (NSURL *)url; 
{ 
    id file = [self createFileForURL: url]; 
    Finalization objectFinalization = ^() { 
     (void)url; 
     [file close]; 
    } 
    id request = [self buildRequestFromURL: url]; 
    [object download: request 
       toFile: file 
     finalization: objectFinalization]; 
} 

如果只想在调试:

- (void)downloadObjectUsingURL: (NSURL *)url; 
{ 
    id file = [self createFileForURL: url]; 
    Finalization objectFinalization = ^() { 
#if DEBUG 
     (void)url; 
#endif 
     [file close]; 
    } 
    id request = [self buildRequestFromURL: url]; 
    [object download: request 
       toFile: file 
     finalization: objectFinalization]; 
} 
3

裹在#ifdef debug.. #endif

+0

我要继续前进,只是接受这一点,因为我认为这是我会得到的最佳答案。但是我可能会为此做一些宏:'#define FORCE(a)NSLog(@“%@”,a)'或'#define FORCE(a)' – 2011-05-16 18:45:22

1

调用NSLog()我想到了一个更好的答案,但由于@NSResponder让我觉得是这样的:

#if DEBUG 
#define FORCE(a) NSParameterAssert(YES || a) 
#else 
#define FORCE(a) 
#endif 

这使得代码如下所示:

- (void)downloadObjectUsingURL: (NSURL *)url; 
{ 
    id file = [self createFileForURL: url]; 
    Finalization objectFinalization = ^() { 
     FORCE(urL); 
     [file close]; 
    } 
    id request = [self buildRequestFromURL: url]; 
    [object download: request 
       toFile: file 
     finalization: objectFinalization]; 
} 
相关问题