ios - 为什么这是对象的合法释放? (iOS内存管理)

标签 ios memory-management

我刚刚开始了解如何在 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];  
}  

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

self.navigationItem.rightBarButtonItem = item; 

紧接在这一行之后,项目被释放。

[item release]; 

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

最佳答案

这是因为 rightBarButtonItem 被声明为 retained。 (参见 UINavigationItem Documentation)

当您将属性声明为保留时:

@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem

你是说当你改变它的值时 aNavItem.rightBarButtonItem = aNewItem 你会发送一个 [aNewItem retain] 消息。

因此您之后可以安全地释放它(因为它由 rightBarButtonItem 保留)

有关更多信息,我强烈建议您查看(每月一次,直到习惯它,直到它成为第二天性)Apple Memory Management Documentation

关于ios - 为什么这是对象的合法释放? (iOS内存管理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7231926/

相关文章:

ios - UICollectionViewCell 布局边距从不更新

c - 全局数组是否分配在栈上

javascript - 浏览器是否总是将 Javascript 中的字符串和数字视为不可变的?

c - 为列表节点分配内存的安全方法

ios - 如何将 MobileFirst CLI 应用程序部署到 IOS 设备?

ios - iPhone UI 小部件大小调整

ios - 如何使用 segue 维护 UITabBar

ios - 在自定义 tableviewcell 中更改 UIImage

memory-management - 兆字 (MW) 是什么意思?

c++ - 在模块(exes和dlls)之间使用STL(TR1)shared_ptr是否安全