1

我只是在阅读通用应用程序的样板代码,我看到了这个:

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

还有:

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

我不确定我是否理解整个下划线的内容,但我认为这是为了保护您不直接访问 ivar,而是通过属性访问它(为什么?我不知道......但我接受这就是它的)。

但是,我没有得到的是,如果self.navigationControllerautoreleased 那么这肯定会_navigationController在最后发布时引起问题吗?

更令人困惑的是for中没有retain位。@propertynavigationController

所以据我所知_navigationController,通过属性访问的navigationControllerautoreleased ,然后直接访问并在 dealloc 中释放(肯定已经可以自动释放了?)。

大声笑,我希望有人可以解释这里发生了什么!我确信样板代码可能没有错!

谢谢你。

4

2 回答 2

2

你还没有发布@property.
但我想是这样的:

@property (strong, nonatomic) UINavigationController *navigationController;

在非 ARC 环境中,强是保留的同义词。
随着 ARC 的引入,Apple 停止在其属性中使用保留,即使对于非 ARC 项目模板也是如此。

所以当通过它的设置器分配时,navigationController 会被保留,并且自动释放是为了抵消分配。
但我很确定你已经了解了那些基本的内存管理规则。

于 2011-12-08T11:40:02.460 回答
1

问题中缺少两个重要的陈述:@property@synthesize

我最好的猜测是:

@property (retain, nonatomic) UINavigationController * navigationController;

@synthesize navigationController = _navigationController;

由于@property 在调用setter 时指定retain,“self.navigationController =”,因此任何现有值都会被释放并保留新值。因此,新值的自动释放被设置器中的保留所抵消。

@synthesize声明说用作属性的_navigationControllerivar navigationController

这不是 ARC 代码。

于 2011-12-08T11:43:52.393 回答