本地对象内存管理

时间:2013-09-06 12:58:53

标签: objective-c memory-management uiimageview

我正在Objective-C中实现一个应用程序,并开始分析它。看起来我对某些图片有些问题。例如,我写道:

Example = [[UIImageView alloc] initWithFrame:CGRectMake(15, 70, 290, 98.5)];
UIImage * ImageExample = [UIImage imageNamed:@"Test.png"];
Example.image = ImageExample;
[ImageExample release];
[Menu addSubview:Example];
[Example release];

它给了我:

  

调用者

此时不拥有的对象的引用计数的不正确递减

我找到了一些例子,NSString使其成为本地的,并在使用后发布。

请问这类代码有什么问题吗?

4 个答案:

答案 0 :(得分:4)

 UIImage * ImageExample = [UIImage imageNamed:@"Test.png"];

给出autorelease对象,你不能释放它,因为你没有分配(拥有)它。

答案 1 :(得分:0)

您没有ImageExample。所以你不应该发布它。看一下本指南: iOS Memory Management Programming Guide 特别是关于“基本内存管理规则”的文章。

答案 2 :(得分:0)

删除以下声明,它应该可以正常工作。

[ImageExample release];

答案 3 :(得分:-1)

编辑:

您应该只发布自己拥有的对象。

您只释放已为其分配内存的对象。因此,拇指规则是 - 只有在使用了init时才使用release。

另外,从iOS5开始? Apple给了我们一个名为ARC(自动参考计数)的东西。只需确保在创建项目时勾选复选框。使用ARC,您根本不必使用发布声明。编译器将为您完成工作。

虽然ARC简化了很多事情,但你也可以犯错误。如果您对目标C中的编码感到满意,我建议您阅读ARC。请查看与ARC相关的WWDC会话视频。