3

私は iOS 3 以降、iOS 開発を行っていないので、記憶が少しぼんやりしています (ただし、メモリ管理に苦労したことは一度もありません。

新しいプロジェクトを開始していますが、スケルトン コードが次のように構成されている理由がわかりません。

- (void)dealloc
{
    [_window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc]
                    initWithFrame:[[UIScreen mainScreen] bounds]]
                   autorelease];
    // ... snip ...
}
  1. window オブジェクトが自動解放されるのはなぜですか? 古いiOSバージョンでは、このようになったことは一度もなかったと確信しています。
  2. どこ_windowから来たの?これはアクセスする別の方法[self window]ですか?

私はこれを次のように書いたでしょう:

- (void)dealloc
{
    [self.window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc]
                   initWithFrame:[[UIScreen mainScreen] bounds]];
    // ... snip ...
}

自動解放されたオブジェクトを決して解放しないようにといつも私に叩きつけられました。実際、そうすると通常、セグメンテーション違反が発生します。

4

4 に答える 4

2

alloc2番目の例では、オブジェクトに保持カウント1を与えるため、ウィンドウオブジェクトをリークして_windowいます。これは、割り当てられたオブジェクトも保持するプロパティを介して割り当てます。

autorelease オブジェクトを解放するべきではないのは事実ですが、dealloc では、プロパティの iVar を解放していwindowます。保持または強力として宣言されているプロパティは、常に解放する必要があります。(ただし、ARC を使用する場合は除きます)。がプロパティの_windowiVar として自動的に生成されるようになりましたwindow

またはself.でプロパティを使用すべきではないと考える人もいます。したがって、私がそれを行う方法は次のとおりです。initdealloc

 [_window release], _window = nil;

これは_window、解放後に を nil に設定し、他のスレッドがこれを使用したい場合に を呼び出すようにしnilます。これにより、クラッシュを防ぐことができますが、奇妙な動作が発生する可能性もあります。これは完全にあなた次第です。


ARC に移行する必要があります。これは、コンパイル時にリリース/オートリースを追加するためのコンパイラ オプションです。ARC を使用するときにプロパティを正しく設定すれば、これらを自分で追加する必要はありません。

于 2013-01-24T10:19:56.723 に答える
0

windowプロパティメモリ記述子がどのようなものかを確認してください。strong/だとretain思います。その場合、windowプロパティを設定すると、その値が保持されるため、で解放する必要がありますdealloc

コードパスをたどります。

  1. [UIWindow alloc]=1のretainCount。
  2. 自動リリース=0のretainCount
  3. self.windowを設定すると、retainCountがバンプされます。retainCountは現在= 1であり、...まで存続します。
  4. リリースするdeallocと、retainCount = 0になり、オブジェクトが削除されます

後のiOSSDKでは、自動合成されたプロパティがアンダースコアプレフィックス付きのインスタンス変数を自動的に作成することを見逃したかもしれません。だからあなたもあなたので行うことができself.window = nilますdealloc

于 2013-01-24T10:20:54.943 に答える
0

1. window オブジェクトが自動解放されるのはなぜですか? 古いiOSバージョンでは、このようになったことは一度もなかったと確信しています。

ウィンドウ オブジェクトが自動解放されない場合、リークが発生します。使用しているので

 self.window  = [[[UIWindow alloc] ....]autorelease];

self.構文では、セッター関数を呼び出すことができます。これにより、オブジェクトが一度保持されます。したがって、使用して割り当てた実際のウィンドウ オブジェクトは解放する[UIWindow alloc]必要がありautoreleaseます。保持を使用しself.た構文は、dealloc で概念的に解放されます。そのため、1 つの割り当てと 1 つの保持に対して、2 回リリースしています。

_window はどこから来たのですか? これは にアクセスする別の方法ですか [self window]

さて、この質問はすでにここで議論されています

于 2013-01-24T10:23:39.970 に答える
0

だから私はこれを理解しました(ほとんど)。@property宣言には属性strongがあります。どうやらこれは ARC (私は実際には使用していません) にとって新しいものであり、それ以外の場合は単に のエイリアスでretainあるためself.window = [ ... ]、オブジェクトが保持されるため、自動解放されます。

変数についてはまだ明確ではありませんが、_window単なるショートカットだと思います。

于 2013-01-24T10:20:13.197 に答える