2012-02-24 9 views
8

私はコードでこれを定義しています。私はこのコントローラがストーリーボードで使用されていることを確かめ、このコレクションに3つのセルを接続しました。 NSLogはデバッグのために追加でなぜStoryboardの静的セルを指すIBOutletCollectionがnullを返すのですか?</p> <pre><code>@property (nonatomic, weak) IBOutletCollection(UITableViewCell) NSSet * certaintyCells; </code></pre> <p>をして合成した:

次に、didSelectRowAtIndexPath:メソッド呼び出しでは、私は、このコードを追加:

 NSLog(@"Certainty Cells: %@",certaintyCells); 
     for (UITableViewCell * cell in certaintyCells) { 
      [cell.textLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]]; 
      [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; 
     } 

出力はこれです:

Certainty Cells: (null) 

そしてもちろん、期待される動作はしていません起こる。

これはなぜ起こっているのですか?ダイナミックプロトタイプではなく、スタティックセルを使用していることを確認しました。補足として、これらの3つのセルは、それぞれのIBOutletsに接続されています。

ありがとう、

答えて

33

私は当時わたしには分かりませんでした。 プロパティをweakからstrongに変更しました。ビューが、メモリの警告は/ etcにアンロードすることを決定した場合、私は割り当てが解除されることから何かを維持したくなかったので

:私は最初の場所で(弱い)を持っていたのはなぜ

なぜこの考え方は間違っていた:

IBOutletCollectionはNSSetかにNSArrayのインスタンスであるため。それ自体がサブビューではないので、NSSet/NSArrayはビューによって保持されません。 IBOutletでは弱いプロパティが問題なく、IBOutletCollectionでは強いプロパティが必要です。そうでなければ、参照カウントは直ちにゼロになり、割り当てが解除されます。

私はこれを他の人に役立つことを希望してここに残しています。

+0

アップルの文書で答えが見つかりませんでした。それを強く変えました、それは今働きます。私はそれがdeallocedされるかどうか疑問に思う..誰ですか? – Oritm

+0

ビューコントローラが解除されたときに自動的に解除されるはずです。ビューアを解除するには、viewDidUnloadのnilに設定します。 –

3

ARCは、オブジェクトが誰からも参照されていないと推測し、値をnilに設定して、ある時点でそれを解放するので、(null)値はオブジェクトを解放する結果であると言います。

関連する問題

 関連する問題