2

質問があります。この質問に対する非常に簡単な解決策があるかもしれませんが、私はまだそれを理解することができません. プロパティを使用する場合は、と言い@property(nonatomic, retain)UIView *mainViewます。

これを .m ファイルに合成し、次のように dealloc メソッドで解放します。

- (void)dealloc {
   [mainView release], mainView = nil;
   [super dealloc];
}

次に、私viewDidLoadはそれを割り当てて、次のような私のself.viewようなサブビューとして追加しています:

- (void) viewDidLoad {

  mainView = [[UIView alloc] init];
  .
  .
  .
  [self.view addSubView: mainView];
}

mainViewこの時点で、 3 つの参照カウント (1 つは alloc から、1 つは保持されたプロパティであるため、3 つ目は に追加したときself.view) があり、その親コン​​トローラーもそれを所有することを理解しています。さて、私の質問は、自分のビューをself.viewに追加した後、次を使用してmainViewを解放するかどうかです

[mainView release];

既に割り当て解除されたオブジェクトにリリースを送信しているため、前のビューに戻るとアプリがクラッシュします。ここで私の質問は、ここで自分の見解をどのように過剰にリリースしているのかということです。次のコードを使用すると正常に動作し、クラッシュが発生しないため、何が欠けていますか。

- (void) viewDidLoad {
  UIView *newView = [[UIView alloc] init];
  self.mainView = newView;
  [newView release];
  .
  .
  .
  [self.view addSubView: mainView];
}

この 2 番目の viewDidLoad メソッドが機能する理由はわかっていますが、最初のメソッドが失敗する理由はわかりません。右?

注:最初のviewDidLoadでは、autoreleaseメソッドを使用してivarに割り当てられているビューを解放でき、クラッシュしないことを理解していますが、要点はautoreleaseの使用を可能な限り削減しようとしていることです。そして、私はARCをまったく使用していません

説明と提案をいただければ幸いです。

4

3 に答える 3

3

あなたの質問から:

この時点で、私のmainViewには3つの参照カウントがあることを理解しています(1つはallocから、1つは保持されたプロパティで、3つ目はself.viewに追加したとき)

プロパティを介して割り当てたのではなく、インスタンス変数に直接割り当てたので、保持はありませんでした。ARC でのみ、インスタンス変数への代入で値が保持されます。したがって、手動リリースは実行しないでください。

于 2013-01-16T03:58:35.557 に答える
2

@property保持するには、 としてではなくmainViewとして使用する必要があります。後者を単独で使用すると、保持されません。基本的に呼び出す場合は、内部的に行うセッターメソッドを呼び出しています。直接割り当てている場合、このセッターは実行されず、retain は実行されません。self.mainViewmainViewself.mainView = ...mainView[mainView retain];

このように試してみるとよいでしょう。

self.mainView = [[[UIView alloc] init] autorelease];
[self.view addSubView:self.mainView];

またはあなたの質問に示されているように。

UIView *newView = [UIView alloc] init];
self.mainView = newView;
[newView release];
[self.view addSubView:self.mainView];

プロジェクトに ARC を使用することもできます。コードは ARC では次のようになります。

self.mainView = [[UIView alloc] init];
[self.view addSubView:self.mainView];

詳細については、ドキュメントを確認してください。

于 2013-01-16T03:58:43.897 に答える
2

最初の viewDidLoad メソッドでは、self.mainView のみを参照していないため、mainView が保持されません。プロパティの作業を保持するには、self.mainView を使用して mainView を設定する必要があります。

于 2013-01-16T03:59:00.250 に答える