Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这是一个物体的合法释放?(iOS内存管理)_Ios_Memory Management - Fatal编程技术网

为什么这是一个物体的合法释放?(iOS内存管理)

为什么这是一个物体的合法释放?(iOS内存管理),ios,memory-management,Ios,Memory Management,我刚刚开始学习如何在iOS中正确释放用于内存管理的对象。我最大的问题是基于下面的代码 - (void)viewDidLoad { [super viewDidLoad]; self.title = @"My View Controller"; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem

我刚刚开始学习如何在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];  
}  
好的,我看到已经创建了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带来了不同的问题,这些是你应该问的。有趣。好的,谢谢你,杰里米。