2011-05-16 68 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]; 
} 
相關問題