首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复内存泄漏?

如何修复内存泄漏?
EN

Stack Overflow用户
提问于 2011-08-30 22:15:28
回答 3查看 274关注 0票数 5

在做了一个长配置文件测试后,我发现在我的一个".m“文件中,viewdidload部分发生了内存泄漏。我检查了一下,xcode突出显示了我使用值初始化选择器数组的部分。我的程序使用选择器进行用户输入。我的程序中有3-5种不同的视图。第一个是免责声明,第二个是一个菜单,用户可以在其中选择他/她想要进行的计算类型。每次计算都需要用户从选取器输入某些输入。例如。其中一个视图有5个输入,这些输入由5个不同的uipickers处理,这些uipickers使用独立的数组来保存值。这些数组使用该视图的viewdidload方法中的值进行初始化。下面是我在运行测试后发现的情况:

...................................................................................................

这是我第一次开发应用程序,我有点不知道该怎么做。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-30 22:35:50

目标C中的对象具有保留计数。当对象超出作用域时(当您停止使用它时),如果此保留计数大于0,则会泄漏。

以下操作会增加保留计数

  • [alloc init]
  • new
  • copy
  • retain
  • adding a object to a array
  • a object as a child (例如,)
    • 可能还有更多,但您似乎没有在代码

    中使用任何其他对象。

以下操作将减少保留计数

从数组中释放对象

  • 如果取消分配数组,则会释放该数组的所有对象

您应该仔细检查您的代码,并确保数组中的每个保留或添加都与相应的版本相匹配。(可以在dealloc方法中释放成员变量)。

编辑: Jeremy提出了一个有效的观点,即我的答案不是

一旦您将对象添加到数组中,它就会获得所有权,并在使用完对象后释放该对象。您需要做的就是确保根据内存管理规则释放您拥有的所有内容

还有自动释放对象,看一下这个例子;

代码语言:javascript
复制
-(init){
    ...
    stagePickerArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 3; i++)
    {
        //this string is autoreleased, you don't have call release on it.
        //methods with the format [CLASS CLASSwithsomething] tend to be autorelease
        NSString *s = [NSString stringWithFormat:@"%d", i);
        [stagePickerArray addObject:s];
    }
    ...
 }

我认为您唯一缺少的就是在dealloc方法中调用release

代码语言:javascript
复制
-(void) dealloc
{
    [stagepickerarray release];  //Do this for each of your arrays
    [super dealloc];
}
票数 4
EN

Stack Overflow用户

发布于 2011-08-30 22:35:50

泄漏工具只会告诉你你在哪里分配了它认为泄漏的对象。所以,它告诉你,例如,

代码语言:javascript
复制
NSString* answer = [NSString stringWithFormat: ...

分配一个从未释放的对象。现在,-stringWithFormat:给了你一个you do not own的对象,你似乎没有把它保留在任何地方。因此,你不需要释放它,所以它不会自己泄漏。

这意味着你拥有的其他东西必须保留它,并且你永远不会释放其他东西。首要嫌犯似乎是stagePickerArray。检查您是否在某个地方发布了stagePickerArray。如果它是-viewDidLoad本地的,那么它必须在该方法结束之前被释放或自动释放。如果它是实例变量,则必须在类的-dealloc方法中释放它。

票数 2
EN

Stack Overflow用户

发布于 2011-08-30 22:23:44

在Objective-C中,您需要注意已分配内存的保留计数。如果你不需要它,->释放它。

当你分配一个对象时,它将返回一个保留计数= 1的对象。

通过使用retain,保留计数递增,使用release,保留计数递减。只要保留计数等于0,对象就会被销毁。

所以,当你想在其他地方使用这个对象时,你需要保留它。所以你要确保这个对象不会在另一个调用release的'person‘(或者它使用的任何东西)之后被删除。

这是一个非常简短的描述。请查看以下指南Memory Management Guide for iOS

(另外,您还想阅读一些关于自动保留计数的内容,这是iOS5中的新特性!ios5 best practice release retain

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7244641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档