17

ビューを NIB ファイルにレイアウトし、UIView サブクラスをファイル所有者として追加しました。

サブクラスは次のようになります。

@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;

このため、プロパティは弱いです: https://stackoverflow.com/a/7729141/1016515

次に、ペン先のラベルと UIImageViews をビューからファイル所有者に結び付けました。

次に、サブクラスの awakeFromNib 部分で、次のようにしました。

[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);

categoryLabel と画像のアドレスが表示されることを期待していました。代わりに、カテゴリ ラベルは問題なく、画像はnil.

imagesとの宣言categoryLabelが同一であるため、これは非常に不可解です。一方が機能し、もう一方が失敗するのはなぜですか?

4

1 に答える 1

78

質問がどこにも見つからなかったので、これを掲載していますが、IBOutlet の操作に慣れていても、IBOutletCollections の操作に慣れていない場合は、間違いを犯しやすいようです。

プロパティを作成したweakのは、別の質問で説明した理由により、IBOutlets に対して通常行うことだからです。

私が忘れていたのは、IBOutletCollection はクラスのインスタンス変数であり、ビュー階層への単なる任意の参照ではないということです。したがって、弱いプロパティの場合NSArray *、他の IBOutlet プロパティのようにビュー階層がそれを保持していないため、すぐに解放されます。

修正は簡単です。プロパティを次のようにしますstrong

@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images;

更新:この回答によると、ほとんどすべての IBOutlets は、保持サイクルを回避するために弱くする必要がない限り、強くする必要があります。これは新しいことであり、ほとんどのドキュメンテーションでは、アウトレットは弱いはずだといまだに述べています。

于 2013-05-03T08:43:13.093 に答える