为什么这是对象的合法发布?(iOS内存管理)

Rya*_*yan 0 memory-management ios

我刚刚开始学习在iOS中正确释放用于内存管理的对象.我最大的问题是基于以下代码.

- (void)viewDidLoad {  
    [super viewDidLoad];  

    self.title = @"My View Controller";  

    UIBarButtonItem *item = [[UIBarButtonItem alloc]   
                             initWithBarButtonSystemItem:UIBarButtonSystemItemAdd   
                             target:self   
                             action:@selector(doSomething)];  
    self.navigationItem.rightBarButtonItem = item;  

    [item release];  
}  
Run Code Online (Sandbox Code Playgroud)

好的,我看到UIBarButtonItem已经创建(alloc).现在,它被设置为rightBarButtonItem以下行中的属性:

self.navigationItem.rightBarButtonItem = item; 
Run Code Online (Sandbox Code Playgroud)

在此行之后,该项目将被释放.

[item release]; 
Run Code Online (Sandbox Code Playgroud)

我假设该项目被复制到rightBarButtonItem但我怎么知道这发生了.如果它通过引用传递,我会有一个问题,不是吗?有人可以澄清这里发生了什么以及为什么发布该对象是合法的?非常感谢.

apo*_*che 5

这是因为rightBarButtonItem宣布了retained.(参见UINavigationItem文档)

将属性声明为保留时:

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem
Run Code Online (Sandbox Code Playgroud)

您说当您更改其值时,aNavItem.rightBarButtonItem = aNewItem您将发送一条[aNewItem retain]消息.

因此,您可以安全地释放它(因为它被保留rightBarButtonItem)

有关详细信息,我强烈建议您在Apple内存管理文档中查看(每月只是习惯它,直到它成为第二天性)