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