1

私はARCに変換していますが、コードを壊さずにこのコンパイラエラーを取り除く方法を見つけることができません。

2つのオブジェクトをセレクターに渡す必要があるので、以下に示すように両方を配列に追加し、その配列をセレクターに送信します。

LWPagerContent* content = nil;
NSArray* args = [NSArray arrayWithObjects:article, [NSValue valueWithPointer:&content], nil];

[self performSelectorOnMainThread:@selector(initArticlePagerContent:) withObject:args waitUntilDone:YES];

このメソッドは配列にアクセスしますが、配列で参照されているアドレスのオブジェクトを変更する必要があります。図のようにLWPagerContentオブジェクトを初期化する必要があります。その後、そのオブジェクトは、performSelectorを呼び出した元のメソッドによって使用されます。

- (void)initArticlePagerContent:(NSArray*)args {
Article* article = [args objectAtIndex:0];

LWPagerContent** contentPtr = [[args objectAtIndex:1] pointerValue];
*contentPtr = [[NSClassFromString([StyleSheet articleContentClass]) alloc] initWithArticle:article];

}

これは問題なく動作しますが、ARCに変換しようとすると、すぐにそのように言われ"Implicit conversion of a non-Objective-C type 'void *' to 'LWPagerContent *__strong *' is disallowed with ARC"ます。"LWPagerContent **..."このエラーは、 (上記の最後から2番目の行)で始まる行で発生します。他の投稿で推奨されているように使用__bridgeしてみましたが、何も機能しないようです。__autoreleasingどんな提案でも大歓迎です。

4

3 に答える 3

7

ブロックを使用してメイン スレッドに移動し、-performSelector: 呼び出しによって暗示されたメタプログラミングを排除します。

次に、コールバックを使用して、生成されたコンテンツを設定します。

いえ

dispatch_sync(dispatch_get_main_queue(), ^{
    LWPagerContent *newContent = ... do something ...
    [self setPagerContent:newContent];
});

いくつかのメモ:

  • init...メソッドは、初期化子でない限り呼び出されるべきではありません

  • 参照渡しは一般的に避けるべきです

  • メタプログラミングは、健全性チェックを行うコンパイラの機能を弱体化させます。避けてください。

于 2013-02-12T21:13:37.300 に答える
1

コンパイラは、生のポインターをどうするかを知りません。期待するメモリ管理戦略の種類を明示的に述べる必要があります。あなたの場合、それは次のようなものになる可能性があります

LWPagerContent * __strong *contentPtr = (LWPagerContent * __strong *)[[args objectAtIndex:1] pointerValue];

型は「への強いポインタへのポインタLWPagerContent」です。今後は*contentPtr、ARC によってストロング ポインターとして扱われます。

于 2013-02-12T21:17:42.330 に答える
0

やってみました:

NSValue* contentPtrPtr = [args objectAtIndex:1];
LWPagerContent** contentPtr = [contentPtrPtr pointerValue];
于 2013-02-12T21:10:08.737 に答える