2

編集:本当にごめんなさい。投稿で行った紛らわしいエラーを編集しました。

私はこれらをivars宣言しましたWhereamiViewController.h

CLLocationManager *locationManager;
IBOutlet MKMapView *worldView;
IBOutlet UITextField *locationTitleField;

WhereamiViewController作成者は、所有者locationManagerlocationManager'sデリゲートはであるため、デリゲートはの代わりにあるため、メソッドWhereamiViewControllerlocationManagerデリゲートをに設定する必要があると書いています。ファイル内で、を委任するように設定されていますが、両方が代わりにある場合に、これら2つの委任を設定する必要がないのはなぜですか?nilWhereamiViewController's deallocassignedweak.xibworldViewlocationTitleFieldFile's Ownernilassignweak

PS:それはARCを使用しています

4

3 に答える 3

2

locationManager must be set to nil in the WhereamiViewController's dealloc method

はそのCLLocationManagerデリゲートを保持しません。locationManagertoをnilinに設定したとしても、保持サイクルが呼び出されるdeallocことはないため、保持サイクルを中断することはできませんdealloc。ビューコントローラを閉じたりポップしたりするなど、保持サイクルを中断する他のイベントが必要です。

しかし、なぜこれら2つをnilに設定する必要がないのでしょうか。

クラスがデリゲートを保持しないことが文書化されている場合は、保持サイクルについて心配する必要はありません。ドキュメントは、ヘッダーファイルを見て、またはでassignはなく検索するだけで作成される場合があります。デリゲートを保持しないため、に割り当てる必要はありません。ただし、クラスの割り当てが解除された後もイベントを受信する可能性がある場合は、クラスの割り当てが解除された後のコールバックを防ぐために、メソッドでデリゲートをに設定する必要があります。strongretainCLLocationManagerlocationManagernillocationManagernildealloc

- (void)dealloc
{
    //Prevent callbacks after dealloc
    //Useful if locationManager is a singleton or used elsewhere
    locationManager.delegate = nil;

    [locationManager release]; //If not ARC
    [super dealloc];//If not ARC
}
于 2012-08-13T15:38:38.420 に答える
0

locationManagerWhereamiViewControllerのdeallocメソッドでnilに設定する必要があります。

それは何もしません。

手動の参照カウントを使用している場合は、WhereamiViewControllerのdeallocでリリースする必要があります(WhereamiViewControllerが所有しているため)。locationManagerインスタンス変数をラップするプロパティがある場合、そのプロパティが保持プロパティである限り、deallocでそのプロパティをnilに設定して、同じ効果を実現できます。ただし、deallocでプロパティを使用することは、一般的にAppleによって推奨されていません。

ARCを再利用している場合は、コンパイラがすべてを行います。

WhereamiViewControllerのdeallocで行う必要があるのは、ロケーションマネージャのデリゲートをnilに設定することです。これは、ロケーションマネージャがdeallocを超えて存続する場合、存在しないWhereamiViewControllerにデリゲートメッセージを送信したくないためです。

繰り返しますが、ARCでは、CLLocationManagerのデリゲートが弱参照である場合、nillingが自動的に行われます。

しかし、なぜこれら2つをnilに設定する必要がないのでしょうか。

そうではありませんが、代理人の割り当てが解除された場合、同じ理由が代理人にも当てはまります。

于 2012-08-13T15:42:04.430 に答える
0

nilさて、あなたはそれを単に予防措置として設定する必要があります。私はあなたを混乱させましたか?説明させてください。

の設定は、実際にはサイクルとはnil関係ありません。コントローラーにデリゲート呼び出しを送信しないようにするだけです。たとえば、コントローラーが解放されている間に位置を更新している場合でも、ビューコントローラーに参照が設定されていると、位置パラメーターを使用してデリゲートが呼び出されます。retain releaselocationManagerlocationManagerlocationManagerdelegate

ただし、コントローラーの割り当てが解除されているため、呼び出しによってメモリアクセスが不良になります。

ただし、に設定すると、ポインタのnil操作は影響を受けないため、例外はスローされません。nil

于 2012-08-13T16:08:38.173 に答える