我刚刚阅读了通用应用程序的样板代码,我看到了:
- (void)dealloc
{
...
[_navigationController release];
...
}
还有:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
...
}
我不确定我理解整个下划线的事情,但我认为这是为了保护你不要直接访问ivar,而是通过财产访问它(为什么?我不知道......但我接受了这就是它的原因。
但是,我没有得到的是,如果self.navigationController
为autorelease
,那么当_navigationController
在最后发布时,这肯定会导致问题吗?
更令人困惑的是retain
@property
中没有navigationController
位。
据我所知,通过属性_navigationController
访问的navigationController
是autorelease
d然后直接访问并在dealloc中释放(它可能已经被自动释放了吗?)。
谢谢。
答案 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代码。