1

ユニバーサルアプリの定型コードを読んでいたところ、次のことがわかりました。

- (void)dealloc
{
    ...
    [_navigationController release];
    ...
}

そしてさらに:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
        self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
    ...
}

アンダースコアのすべてを理解しているのかどうかはわかりませんが、ivarに直接アクセスするのではなく、プロパティを介してアクセスするのを防ぐためだと思います(なぜですか?わかりません...しかし、これが何であるかを受け入れますそのため)。

しかし、私が得られないのは、self.navigationControllerdの場合、最後にリリースされたautoreleaseときに確かにこれが問題を引き起こすということですか?_navigationController

さらに紛らわしいのは、 forにretainビットがないという事実です。@propertynavigationController

私が知る限り_navigationController、プロパティを介してアクセスされるのnavigationControllerautoreleasedであり、直接アクセスされて、deallocでリリースされます(すでに自動リリースされている可能性がありますか?)。

笑、誰かがここで何が起こっているのか説明できるといいのですが!ボイラープレートコードはおそらく間違っていないはずです!

ありがとうございました。

4

2 に答える 2

2

を投稿していません@property
しかし、私はそれがそのようなものだと思います:

@property (strong, nonatomic) UINavigationController *navigationController;

非ARC環境では、strongはretainの同義語です。
Appleは、ARC以外のプロジェクトテンプレートであっても、ARCの導入により、プロパティでの保持の使用を停止しました。

したがって、navigationControllerは、そのセッターを介して割り当てられたときに保持され、自動解放は割り当てを打ち消すためにあります。
しかし、これらの基本的なメモリ管理ルールはすでに理解していると思います。

于 2011-12-08T11:40:02.460 に答える
1

@property質問から欠落しているのは、2つの重要なステートメントです@synthesize

私の最善の推測は、これらは次のとおりです。

@property (retain, nonatomic) UINavigationController * navigationController;

@synthesize navigationController = _navigationController;

@propertyは、セッターが呼び出されたときに保持を指定するため、 "self.navigationController ="、既存の値が解放され、新しい値が保持されます。したがって、新しい値の自動解放は、セッターの保持によって打ち消されます。

@synthesizeステートメントは、プロパティのivarとして使用することを_navigationController示していますnavigationController

これはARCコードではありません。

于 2011-12-08T11:43:52.393 に答える