我想構建「假」變量參數列表,使用描述技術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=%@¶m2=%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;
}
必須有一個更好的方式來做到這一點... – semisight
嚴重;對源文章的快速閱讀讓我認爲它只能巧合使用,超出了ABI或規範的範圍。 – bbum
這是真的,但我只需要我的單元測試代碼,所以我不太在意這是一個相當「骯髒的黑客」的事實。雖然如果有人可以指出一個更好的方法來構建一個可變參數列表,我真的很感興趣。 –