2011-10-27 3 views
7

hereの技術を使って、 "偽の"可変引数リストを作成しようとしていますが、ARC対応のプロジェクトでは、私が得ているエラーを取り除く。ARCを有効にしてchar *をid *に変換する方法

ここで問題のコードです:*非Objective-Cのポインタ型「CHARの

キャストを:

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 *キャストに文句を言います'〜' _autoreleasing id * ' はARCで許可されていません

私の初期の理論はth私はちょうど__unsafe_unretainedを(id *)キャストに追加して、私がそのメモリブロックを担当していることをARCに伝える必要があります。保持しないでください。しかし、それはうまくいかず、どうやってこの問題を解決する。

更新:これは完全な機能です。 printf形式の書式文字列と.plist内のフィールド名の変数リストをとり、.plistから読み込まれたデータを含む書式付き文字列を出力する必要があります。つまり、私はフィールド "フィールド1" = "foo" と "フィールド2" = 3と私は、私は、文字列を取得する必要があります[loadStringFromFixture: @"?param1=%@&param2=%d", @"field1", @field2]を呼ぶ "?のparam1 = fooの& PARAM2 = 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なしで動作すると、 ARCで動作するはずです。ここでの問題は、あなたがブリッジングなしで行うことができないのObjective-Cのポインタに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); 

これはまだかなり醜いです、と私は本当にのより良い方法があることを願っていますこれを行うが、それはユニットテストのためであるので、私はそれが行う必要があると思う。

EDIT:それはブリッジキャストが代わりに次のように行われるべきであるということがあります

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

まだそのコードでコンパイルエラーがあります。 "mallocの行に" void * "を" __ bridge cast "で" __autoreleasing id * "にキャストしている互換性のない型について不平を言っています。 –

+0

元の投稿をフル機能のテキストで更新しました –

+0

私の編集があなたの解決策であるか、完全に機能していない可能性があります。それをチェックし、参照してください。 –

関連する問題