我写这个回答另一个问题,但它说明了什么你问:在目标C
对象有一个保留计数。如果在对象超出范围时(当您停止使用它时)该保留计数大于0,则会发生泄漏。
下面的东西增加了保留计数
[[alloc] init]
new
copy
[retain]
adding an object to an array
adding an object as a child (e.g. views)
There are likely more, but you don't appear to use any others in your code
下减少保留计数
[release]
removing an object from an array
if you dealloc an array, all of its objects are released
你应该去通过您的代码,并确保每个保留或添加到一个数组匹配与相应的版本。 (你可以在dealloc方法中释放成员变量)。
另一位用户提出我的回答没有
一旦你添加一个对象到一个数组一个有效的点,它取得所有权,当它与它做会释放对象。你所要做的就是确保你根据内存管理规则释放你自己拥有的任何内容。
还有一些autorelease对象,看看这个例子;
-(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];
}
...
}
您的问题是,当您稍后使用字符串时,它的保留计数为零并且已被释放。通过调用retain,你就会说'我想稍后使用它'。不要忘了匹配每一个保留与释放,或者你的对象将“泄漏”
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – zneak
@Zneak,我知道保留会增加计数+1,但是什么原因这样的行为? –
请[请花点时间阅读介绍](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/ 20000994-SW1)。你的程序崩溃了,因为你在一个释放的对象上使用了一个方法,并且你的对象被释放了,因为在你的定时器代码运行时,没有人取得它的所有权。 – zneak