为什么这是一个物体的合法释放?(iOS内存管理)
我刚刚开始学习如何在iOS中正确释放用于内存管理的对象。我最大的问题是基于下面的代码为什么这是一个物体的合法释放?(iOS内存管理),ios,memory-management,Ios,Memory Management,我刚刚开始学习如何在iOS中正确释放用于内存管理的对象。我最大的问题是基于下面的代码 - (void)viewDidLoad { [super viewDidLoad]; self.title = @"My View Controller"; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem
- (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];
}
好的,我看到已经创建了uibarbuttonite(alloc)。现在,它被设置为下一行中的rightBarButtonItem
属性:
self.navigationItem.rightBarButtonItem = item;
在这一行之后,项目就被释放了
[item release];
我假设该项被复制到RightBarButtonim中,但是我怎么知道会发生这种情况呢。如果它通过引用,我会有问题,不是吗?有人能澄清这里发生了什么,为什么释放这个物体是合法的吗?非常感谢 这是因为
rightBarButtonItem
被声明为保留
。(见附件)
将属性声明为保留时:
@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem
您的意思是,当您更改其值时,您将发送一条消息
因此,您可以在以后安全地释放它(因为它由右侧按钮按钮保留)
)
有关更多信息,我强烈建议您查看一下(每月一次,只是为了习惯它,直到它成为第二天性)当它被分配给rightBarButtonItem时,它将被保留。重要的是要记住,release并没有“删除对象”,它只是减少retain计数。只有当保留计数达到0时,对象才会被解除分配 在本例中,当您将项指定给RightBarButtonim时,它的保留计数将增加到2。接下来,当您释放它时,retain计数将递减为1。当导航控制器离开时,这将变为0(然后您的项目将被解除分配) 只要它是retain类型的属性,它就可以工作:
@property(nonatomic, retain) UIBarButtonItem *rightBarButtonItem
您可以查看API的标题来确定要分配给哪种类型的属性。Ryan,这里的关键是RightBarButtonim保留了存储在其中的对象
上面的答案很好。我要补充的一点是,您还可以查看文档中描述属性的地方,其中显示@property(nonatomic,retain)。因此,如果您不喜欢阅读头文件,它也在文档中。不要从您开始的地方开始。首先。如果你有权限的话,我建议你查看一下苹果在ARC上的文档,尽管这个链接会告诉你所有的细节。为什么?实际上,我认为显式内存管理对我的学习很有帮助,因为Objective-C对象的显式内存管理已经过时了。你要花时间调查那些随着搬到ARC而消失的问题。ARC带来了不同的问题,这些是你应该问的。有趣。好的,谢谢你,杰里米。