7

それらが存在することは確かですが、ViewControllerでアウトレットを宣言するための公式のベストプラクティスを見つけたり、特定したりするのは困難です。

私が見る限り、3つのオプションがあります:

  1. イヴァルのみ
  2. プロパティのみ
  3. Ivar で裏付けられたプロパティ

現在、IB から ViewController にドラッグしてプロパティを自動生成しようとすると、Xcode がクラッシュしますが、私が覚えている限りでは、そうすると ivar なしでプロパティが作成されます。ivar セクションにドラッグすることもできます。これにより、プロパティのない ivar が作成されます。これは、プロパティのみのアウトレットと ivar のみのアウトレットの両方が Apple で問題ないことを示唆しています。

したがって、viewDidUnload では、アウトレットのいずれかに nil を割り当てる必要がありますが、dealloc はどうでしょうか。ivar なしでプロパティを使用した場合、init または dealloc でアクセサーを使用することを想定していない場合、アウトレットを解放するにはどうすればよいでしょうか?

アクセサーなしでアウトレットを解放できる唯一のパターンは、ivar に裏打ちされたプロパティを使用することであるように私には思えます。そのため、アクセサーを使用せずに dealloc で ivar を手動で解放できますが、これは Apple の 1 つのオプションです。コード生成はサポートしていません。

4

2 に答える 2

1

経験則として、私は通常IBOutlets のアクセサを作成します。

ARC または非 ARC プロジェクトでは、通常、次のことを行います。

//.h (ARC)
@property (nonatomic, weak) IBOutlet UILabel* myLabel;

//.h (non-ARC)
@property (nonatomic, retain) IBOutlet UILabel* myLabel;

//.m
@synthesize myLabel;

このようにして、コンパイラにインスタンス変数を作成させることができます。ただし、インスタンス変数を宣言して、コンパイラにそれを使用するように指示することもできます。

次に、そのアクセサー/インスタンス変数を好きな場所で使用できます。

Apple メモリ管理ガイドには、ARC 以外のプロジェクトがある場合は、initまたはメソッド内のアクセサ メソッドを避ける必要があると書かれています。deallocたとえば、次のようになります。

// (non-ARC)
- (void)dealloc
{
   [myLabel release]; myLabel = nil; // I'm using the instance variable here!
   [super dealloc];       
}

これは、非 ARC プロジェクトでは非常に重要です。その理由は、アクセサーがない場合、KVC は nib オブジェクトをインスタンス変数に割り当て、それに保持を設定するためです。解放するのを忘れると、メモリ リークが発生する可能性があります。アクセサーを使用すると、最後にそのオブジェクトを強制的に解放する必要があります。

Mike Ashによるfriday-qa-2012-04-13-nib-memory-managementを読むことを強くお勧めします。これは nib とメモリ管理に関するとてもクールな記事です。

それが役に立てば幸い。

于 2012-04-26T09:42:18.973 に答える
1

これが私の理解です

他のクラスによってアクセスされる変数のプロパティを使用します。変数は、読み取り (getter) または書き込み (setter) のいずれかです。セッターとゲッターの両方がプロパティ用に合成されます。

所有するクラスのみが内部的に使用する変数には ivar を使用します。つまり、他のクラスは値を設定または取得しません。

確かに ivar の代わりにプロパティを使用できますが、アクセスされるたびに関数呼び出しのオーバーヘッドが発生します。したがって、クラスによって大量にアクセスされる内部変数がある場合、関数呼び出しはリアルタイムのパフォーマンスに影響を与えます。これは、それらを ivar として宣言することで回避できます。

于 2012-10-22T18:02:27.720 に答える