1

次のように、にリンクされたストーリーボードファイル内のオブジェクトがある状況を考えてみIBOutletます。

@property (nonatomic, strong) IBOutlet UIImageView *imageView;

独自のデバイスにViewController任せると、Interface Builderで決定されたように、正しいフレーム内に正しい画像が読み込まれ、表示されます。ただし、次のコードをView ControllerのviewDidLoadメソッドに追加すると、(明らかに)同じ結果が得られます。

- (void)viewDidLoad {
    _imageView = [[UIImageView alloc] init];
    //...
}

これは、のプログラムによる割り当ての初期化IBOutletsが完全にオプションであることを意味しますか?それとも、この行を追加すると、わずかに異なる結果が得られますか?

実装にalloc-initを常に追加していたので、質問しています。その後、最新のプロジェクトでそれを忘れてしまいました。驚いたことに、それでも意図したとおりに機能しました。

4

4 に答える 4

6

ストーリーボードまたはxibファイルは、その中に含まれるオブジェクトのシリアル化です。ストーリーボードが読み込まれると、すべてのオブジェクトがインスタンス化されます(initWithCoder:デシリアライズしているため、を使用して)。これは、xibで定義されているオブジェクトのすべてのプロパティを設定することを追加して、allo/initと同じ仕事をします。

xibには、イメージビューを完全に作成するための十分な情報が含まれています。次に、新しい画像ビューを割り当て/初期化し、それをアウトレットに使用された変数に割り当てると、ストーリーボードから作成されたオブジェクトを置き換えるだけです。これは、アウトレットが何も指していないため、まったく意味がありません。画面。

要約すると、すべてのアウトレットの割り当て/初期化はオプションではなく、間違っています。

于 2012-11-29T08:21:58.907 に答える
2

オブジェクトをNIBに追加すると、オブジェクトのライフサイクルはUIViewController(またはサブクラス)とARC参照によって完全に制御され、ViewControllerはオブジェクトのロード時にオブジェクトの割り当て、初期化、解放を適切に処理するため、デフォルトでは弱くなります。ビュー、つまり、そこで行っていることは、ARC参照をstrongに変更するため、オブジェクトは参照後すぐに解放されません。試したとおりに機能しますが、理論的には、InterfaceBuilderで作成されたオブジェクトで終了します。フレームを設定したり、ビューに追加したりせず、オブジェクトの後方に参照を作成しなかった場合、ARCはそれを解放し、作成した画像ビューで終了します。 Inteface Builder、ただし、_imageViewを作成したばかりの新しい[[UIImageView alloc] init]を参照するときに、ポインタはありません。

于 2012-11-29T08:28:20.103 に答える
1

Xcode 4.4を使用している場合は、プロパティが自動的に合成されます。あなたが経験しているのはこれかもしれませんか?参照

于 2012-11-29T08:19:49.733 に答える
0

ストーリーボード内のオブジェクトの割り当て/初期化は基本的に間違いです。

ビューがロードされると、すべてのサブビューが初期化され、自動的にロードされます。再度初期化すると、別のインスタンスが作成され、オブジェクトの前のインスタンスは未使用になります。

実際、最近初期化されたオブジェクトインスタンスを正しく機能させるには、インスタンス(この場合はUIImageViewのインスタンス)をサブビューとして追加する必要があります。

于 2012-11-29T08:58:53.400 に答える