Objective c 本地对象内存管理

Objective c 本地对象内存管理,objective-c,memory-management,uiimageview,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]; [

我正在用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
,使其成为本地的,并在使用后发布


那么,这种代码有什么问题吗?

您没有自己的ImageExample。所以你不应该释放它。请看本指南: 特别是关于“基本内存管理规则”的文章


提供自动释放对象,您不能释放它,因为您没有分配(拥有)它。

删除下面的语句,它应该可以正常工作

[ImageExample release];
编辑:

您应该只释放您拥有的对象

只释放已分配内存的对象。因此,经验法则是-仅当您使用了init时才使用release

还有,从iOS5开始?苹果给了我们一种叫做ARC(自动参考计数)的东西。只需确保在创建项目时勾选复选框即可。使用ARC,您根本不必使用发布声明。编者将为你做这项工作


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

除非您有很好的理由不使用ARC,否则请使用ARC。现在很难找到不使用ARC的正当理由。我想,在没有ARC的情况下,了解内存管理的工作原理是一件好事。但我同意在“现实世界”中使用ARC更好。我建议你们研究和。我的意思是——你们应该只在你们自己的对象上使用release。在本例中,我只是指OP的initWithFrame示例。事后看来,我想,我应该更准确一些。
[ImageExample release];