Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
Iphone 撞车我能修好,但我不';我不明白为什么';发生什么事了_Iphone_Objective C_Ios_Xcode - Fatal编程技术网

Iphone 撞车我能修好,但我不';我不明白为什么';发生什么事了

Iphone 撞车我能修好,但我不';我不明白为什么';发生什么事了,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,我有一个滚动视图。我在这个滚动视图中添加了一个按钮,然后释放它 UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom]; saveButton.frame = CGRectMake(415.0, 473, 80, 38); saveButton.titleLabel.font = [UIFont fontWithName:@"Heiti TC" size:24]; [saveButton setTitle:@""

我有一个滚动视图。我在这个滚动视图中添加了一个按钮,然后释放它

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];
saveButton.frame = CGRectMake(415.0, 473, 80, 38);
saveButton.titleLabel.font = [UIFont fontWithName:@"Heiti TC" size:24];
[saveButton setTitle:@"" forState:UIControlStateNormal];
[saveButton setContentEdgeInsets:UIEdgeInsetsMake(2, 0, 0, 0)];
saveButton.backgroundColor = [UIColor clearColor];
[saveButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal ];
[saveButton setBackgroundImage:[UIImage imageNamed:@"save.png"] forState:UIControlStateNormal];
[saveButton addTarget:self action:@selector(save) forControlEvents:UIControlEventTouchUpInside];
saveButton.hidden = NO;
[self.scrollview addSubview:saveButton];
[saveButton release];
当视图出现在屏幕上时,应用程序崩溃,我尝试触摸屏幕的任何部分

如果我不加评论

[saveButton release];
该应用程序运行良好

我认为一旦我将按钮添加到scrollview中,按钮的保留计数就会增加,因此释放按钮对我来说是安全的

这是怎么回事?向scrollview添加内容是否与向主视图添加内容不同,如下图所示

[self.view addSubview:saveButton];

按钮的类型:
是一个方便的构造函数,因此它已经创建了一个自动释放的实例,并且不需要释放对象

这意味着以下代码行是错误:

[saveButton release];
您不应该发送
release
,因为实例已经自动删除

详细信息请查看

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];

根据这段代码,它返回一个自动释放的对象,当您使用它完成工作时,您不必释放它。当您将其添加为视图的子视图时,要将其添加到的视图将保留它,并且您不负责其内存管理。

这里的问题是

[UIButton buttonWithType:UIButtonTypeCustom]
方法返回一个仅由自动释放池保留的自动释放对象(该池将在当前事件队列的末尾释放该对象)。这意味着你对它没有所有权(它不会被保留)。将其添加到scroll view会使保留计数增加1,但是您会在下一行中通过发送释放消息立即销毁它

正确的方法是删除release调用(内存管理将非常清楚)


您可以阅读有关iOS内存管理的更多信息。

您尚未将内存分配给button对象。那么你如何才能释放它呢

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];
您调用了一个静态方法,该方法本身负责内存管理。
这是导致应用程序崩溃的唯一原因。

此处没有使用
alloc/init/new
,因此将自动删除。如果您有这样的东西
UIButton*savebutton=[[UIButton alloc]init]
然后您必须使用类似以下的版本:
[saveButton release]

对象及其内存已分配、保留和自动删除无法确定在任何特定时刻重新计数将是什么,您可以知道对象已分配、保留和自动删除。是的,但这只是一个简单的示例,说明整个内存管理过程是如何工作的。从“我们”(又名开发人员)的角度来看,此时的按钮应该只由处理当前事件循环的自动释放池保留。(直到您将其添加到scrollView中)。对象的保留计数永远不能为零。事实上,当它达到保留计数0时,它将被销毁。但是,再一次,为了解释“所有权”(本例中可能是一个更好的词)的目的,当它仅由自动释放池保留时,表示它的所有权为0似乎很好;您仍然在说(a)绝对保留计数和(b)暗示保留计数为0是可能的。没有必要为此创造新的语言;“此时,对象被自动删除。如果要将对它的引用保留在此范围之外,则必须保留它。”这是公认的方言,而且相当准确。当然有点迂腐,但现实是,发明新的、含糊不清的概念来描述已经很好描述的概念对任何人都没有帮助。
buttonWithType
是类方法,因此它已经创建了一个自动释放的实例,无需释放它。查看这个developer.apple页面了解详细信息-我认为save按钮有自动发布的参考,无法发布。