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

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

这是我第一次开发应用程序,我有点不知道该怎么做。任何帮助都将不胜感激。
发布于 2011-08-30 22:35:50
目标C中的对象具有保留计数。当对象超出作用域时(当您停止使用它时),如果此保留计数大于0,则会泄漏。
以下操作会增加保留计数
中使用任何其他对象。
以下操作将减少保留计数
从数组中释放对象
您应该仔细检查您的代码,并确保数组中的每个保留或添加都与相应的版本相匹配。(可以在dealloc方法中释放成员变量)。
编辑: Jeremy提出了一个有效的观点,即我的答案不是
一旦您将对象添加到数组中,它就会获得所有权,并在使用完对象后释放该对象。您需要做的就是确保根据内存管理规则释放您拥有的所有内容
还有自动释放对象,看一下这个例子;
-(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
-(void) dealloc
{
[stagepickerarray release]; //Do this for each of your arrays
[super dealloc];
}发布于 2011-08-30 22:35:50
泄漏工具只会告诉你你在哪里分配了它认为泄漏的对象。所以,它告诉你,例如,
NSString* answer = [NSString stringWithFormat: ...分配一个从未释放的对象。现在,-stringWithFormat:给了你一个you do not own的对象,你似乎没有把它保留在任何地方。因此,你不需要释放它,所以它不会自己泄漏。
这意味着你拥有的其他东西必须保留它,并且你永远不会释放其他东西。首要嫌犯似乎是stagePickerArray。检查您是否在某个地方发布了stagePickerArray。如果它是-viewDidLoad本地的,那么它必须在该方法结束之前被释放或自动释放。如果它是实例变量,则必须在类的-dealloc方法中释放它。
发布于 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
https://stackoverflow.com/questions/7244641
复制相似问题