XCode4.2.1样板代码中的奇数自动释放

时间:2011-12-08 11:32:41

标签: ios xcode boilerplate

我刚刚阅读了通用应用程序的样板代码,我看到了:

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

还有:

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

我不确定我理解整个下划线的事情,但我认为这是为了保护你不要直接访问ivar,而是通过财产访问它(为什么?我不知道......但我接受了这就是它的原因。

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

更令人困惑的是retain @property中没有navigationController位。

据我所知,通过属性_navigationController访问的navigationControllerautorelease d然后直接访问并在dealloc中释放(它可能已经被自动释放了吗?)。

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

谢谢。

2 个答案:

答案 0 :(得分:2)

您尚未发布@property 但我猜它就是这样的:

@property (strong, nonatomic) UINavigationController *navigationController;

在非ARC环境中,strong是retain的同义词 即使对于非ARC项目模板,Apple也会在引入ARC时停止在其属性中使用retain。

因此,当通过其setter分配时,将保留navigationController,并且自动释放是为了抵消alloc。 但我很确定你已经理解了那些基本的内存管理规则。

答案 1 :(得分:1)

该问题遗漏了两个重要声明:@property@synthesize

我最好的猜测是:

@property (retain, nonatomic) UINavigationController * navigationController;

@synthesize navigationController = _navigationController;

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

@synthesize语句表示使用_navigationController作为属性navigationController的ivar。

这不是ARC代码。