繁体   English   中英

我可以解决的崩溃,但我不明白为什么会发生这种情况

[英]A crash I can fix, but I don't understand why it's happening

我有一个scrollview。 我在此滚动视图中添加了一个按钮,然后将其释放。

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];

该应用程序完美。

我想按钮的保留计数会在我添加到滚动视图后增加,所以我可以安全地释放按钮。

这里发生了什么? 是否向滚动视图添加内容与将其添加到主视图(如下所示)不同?

[self.view addSubview:saveButton];

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

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

[saveButton release];

您不应发送release ,因为该实例已经自动释放。

有关详细信息,请查看UIButton参考

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];

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

这里没有使用alloc/init/new ,所以这将是自动释放的。 如果你有这样的东西UIButton *savebutton = [[UIButton alloc]init]; 然后你将不得不使用像: [saveButton release];

这里的问题是

[UIButton buttonWithType:UIButtonTypeCustom]

method返回一个自动释放的对象,该对象仅由自动释放池保留(它将在当前事件队列的末尾释放该对象)。 这意味着你没有对它的所有权(它没有保留)。 将其添加到滚动视图会将保留计数加1,但是您可以通过发送释放消息立即在下一行中销毁它。

执行此操作的正确方法是删除释放调用(并且您将完全清楚内存管理)。

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

你没有为按钮对象分配内存。 所以你怎么能释放它。

UIButton * saveButton = [UIButton buttonWithType:UIButtonTypeCustom];

您调用了一个静态方法,它本身负责内存管理。 这是应用程序崩溃的唯一原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM