2011-10-27 20 views
7

我想構建「假」變量參數列表,使用描述技術here,但對於啓用ARC的項目,我無法弄清楚如何獲得擺脫我得到的錯誤。如何轉換從char *到id *與ARC啓用

這裏是有問題的代碼:

NSMutableArray* argumentsArray = [NSMutableArray array]; 

// ... Here I fill argumentsArray with some elements 
// And then, I want to construct a "fake" variable argument list 

char* fakeArgList = (char*) malloc(sizeof(NSString*) * [argumentsArray count]); 
[argumentsArray getObjects: (id*) fakeArgList]; 

NSString* content = [[NSString alloc] initWithFormat: formatString arguments:fakeArgList]; 

的XCode抱怨在(ID)fakeArgList *鑄造,說:

非Objective-C的指針類型「字符的演員* 'to'_autoreleasing id *' 不允許使用ARC

我的初始理論是th在我只需要添加__unsafe_unretained(id *)鑄造告訴ARC,我負責這塊內存,它不應該保留/釋放它,但這並不工作,我不知道如何解決這個問題。

更新:這是完整的功能。它應該在.plist內採用printf樣式的格式字符串和字段名稱的變量列表,並輸出一個格式化的字符串,其中包含從.plist加載的數據。也就是說,如果我有一個字段「字段1」 =「foo」和「域2」 = 3,我打電話[loadStringFromFixture: @"?param1=%@&param2=%d", @"field1", @field2]話,我應該得到的字符串「?參數1 = foo的&參數2 = 3」

- (NSString*) loadStringFromFixture:(NSString*) format, ... 
{ 
    NSString* path = [[NSBundle mainBundle] bundlePath]; 
    NSString* finalPath = [path stringByAppendingPathComponent:@"MockAPI-Fixtures.plist"]; 
    NSDictionary* plistData = [NSDictionary dictionaryWithContentsOfFile:finalPath]; 

    va_list argumentsList;  
    va_start(argumentsList, format); 

    NSString* nextArgument; 
    NSMutableArray* argumentsArray = [NSMutableArray array]; 

    while((nextArgument = va_arg(argumentsList, NSString*))) 
    { 
     [argumentsArray addObject: [plistData objectForKey:nextArgument]]; 
    } 

    NSRange myRange = NSMakeRange(0, [argumentsArray count]); 

    id* fakeArgList = (__bridge id *)malloc(sizeof(NSString *) * [argumentsArray count]); 
    [argumentsArray getObjects:fakeArgList range:myRange]; 
    NSString * content = [[NSString alloc] initWithFormat:formatString 
               arguments:(__bridge va_list)fakeArgList]; 

    free(fakeArgList); 

    return content; 
} 
+0

必須有一個更好的方式來做到這一點... – semisight

+3

嚴重;對源文章的快速閱讀讓我認爲它只能巧合使用,超出了ABI或規範的範圍。 – bbum

+0

這是真的,但我只需要我的單元測試代碼,所以我不太在意這是一個相當「骯髒的黑客」的事實。雖然如果有人可以指出一個更好的方法來構建一個可變參數列表,我真的很感興趣。 –

回答

1

一個的.plist文件看看這段代碼,它看起來像一個非常骯髒的黑客,但我想如果它沒有ARC工作,它也應該工作弧。這裏的問題是,你從C-指針Objective-C的指針,你不能這樣做鑄造無橋接:

NSMutableArray * argumentsArray = [NSMutableArray array]; 

// ... Here I fill argumentsArray with some elements 
// And then, I want to construct a "fake" variable argument list 

NSRange myRange = NSMakeRange(0, [argumentsArray count]); 
id * fakeArgList = (__bridge id *)malloc(sizeof(NSString *) * [argumentsArray count]); 
[argumentsArray getObjects:fakeArgList range:myRange]; 
NSString * content = [[NSString alloc] initWithFormat:formatString 
              arguments:(__bridge va_list)fakeArgList]; 
free(fakeArgList); 

這仍然是相當醜陋,我真的希望有一個更好的方法這樣做,但由於它是一個單元測試,我想它將不得不做。

編輯:這可能是橋接投應該做這樣的代替:

id __autoreleasing * fakeArgList = (__bridge id __autoreleasing *)malloc(sizeof(NSString *) * [argumentsArray count]); 
+0

該代碼仍然存在編譯錯誤。它抱怨「不兼容類型鑄造」void *「到」__autoreleasing id *「與__bridge鑄造」與malloc一致。 –

+0

我使用全功能文本更新了原始文章 –

+0

我的編輯可能是您的解決方案,或者它可能完全關閉。檢查出來,看看。 –