1

ビューの配列があり、それらをすべて非表示にする必要があるため、次を使用します。

BOOL shouldHideViews = YES;
[allViews makeObjectPerformSelector:@selector(setHidden:) withObject:(void *)shouldHideViews]

コードを ARC に変換すると、ブリッジ キャストが必要であることがわかり、次のように変更しました。

(void *)shouldHideViews

(__bridge BOOL)shouldHideViews

__bridge キャストで「int」を「BOOL」にキャストする互換性のない型と表示されます

では、どうすればいいですか?配列内のすべてのビューを反復処理できることはわかっていますが、これは問題ではありません。一般的に、この ARC と互換性を持たせるために何をすべきかを知りたいのです。

ありがとう!

4

4 に答える 4

1

プリミティブ型を void ポインターとして渡すことはできません。ブール変数をインスタンス変数として保持し、setHidden で参照する必要があります。そうすれば、これを行うことができます:

shouldHideViews = YES; //declare BOOL shouldHideViews; in your .h file
[allViews makeObjectPerformSelector:@selector(setHidden) withObject:nil];
于 2012-06-28T04:04:01.027 に答える
1

これらはあなたにとってかなり役に立ちます

ココアのプリミティブ型で performSelector:withObject:afterDelay: を使用する方法?.

performSelector:withObject:afterDelay: を非オブジェクト パラメータとともに使用する

SEL performSelector と引数

を使用してラッパーを作成するか、 を使用する必要がありNSNumberますNSInvocation

于 2012-06-28T04:08:58.137 に答える
1

へのobject引数makeObjectsPerformSelector:withObject:の型はidです。つまり、Objective-C オブジェクトを指す必要があります。非オブジェクトを にキャストするのidは悪い考えです。なぜなら、システム (特に ARC の下) はretainreleaseメッセージを に送信することが許可されており、 にキャストするidとクラッシュするからです。YESid

高速列挙を使用することをお勧めします。

for (UIView *view in allViews) {
    view.hidden = shouldHideViews;
}
于 2012-06-28T04:12:02.657 に答える
1

この道を通れないことを示す他の答えYESは正しいです。ただし、より簡単な解決策があります。

[allViews setValue:[NSNumber numberWithBool: shouldHideViews] forKey:@"hidden"];

setValue:forKey:これは、まさにこの用途のために NSArray がオーバーライドされるため機能します。

ブロックも使用できるようになりました。

[allViews enumerateObjectsUsingBlock:
  ^(id obj, NSUInteger idx, BOOL *stop){ [obj setHidden:shouldHideViews];}];

または、実証済みの真のfor()ループ (@rob mayoff の回答を参照してください。)

そのうち、私は基本的にforループを使用します。

于 2012-06-28T04:14:46.710 に答える