Sag*_*ari 2 iphone xcode memory-management objective-c nsstring
我有关于内存管理的查询.
让我们从一个例子开始吧.假设我们有一个类如下.
@interface myClass : NSObject {
NSString *xyz;
}
@end
Run Code Online (Sandbox Code Playgroud)
现在,请参阅实施.
@interface myClass : NSObject {
NSString *xyz;
}
@end
@implementation myClass
-(void)abc{
// xyz allocted here
}
-(void)pqr{
// retained or copied many times or may not a single time
}
-(void)mno{
// retained or copied many times or may not a single time
}
-(void)jpg{
// may be released more than one time or may be not
}
//-(void)dealloc{
// [xyz release];
// [super dealloc];
//}
//
//-(void)dealloc{
// if(xyz!=nil && [xyz retainCount]>0){ [xyz release]; xyz=nil; }
// [super dealloc];
//}
-(void)dealloc{
if(xyz!=nil){
while([xyz retainCount]>0)
[xyz release];
xyz=nil;
}
[super dealloc];
}
@end
Run Code Online (Sandbox Code Playgroud)
在上面的代码中.我有三个dealloc函数.哪个更好?如果没有这些,那么请建议你的.
我很困惑,因为Objective C说,每次都必须释放对象=每次分配/保留.
但大多数示例代码只有单个语句"[xyz release];" 它不会造成内存泄漏吗?
Dav*_*ong 12
这是绝对错误的:
while([xyz retainCount]>0)
[xyz release];
xyz=nil;
Run Code Online (Sandbox Code Playgroud)
retainCount将永远不会返回0,因为只要您处于retainCount为1且对象被释放,运行时就会立即释放它,并且永远不会减少retainCount.即使它确实减少了retainCount,该对象现在也被释放了.你怎么会问它什么是retainCount?
简而言之,您的设计是错误的.如果你无法跟踪你以更智能的方式保留对象的频率,那么你将会发生内存泄漏,并且很可能会因过度释放的对象而崩溃(这会导致应用程序崩溃).
如果你绝对不能改变你的代码(如果你说你不能改变我就不相信你),那么你想要保留第二个整数ivar,表明你保留了多少次xyz,然后用它来弄清楚你应该释放多少次.(但是,这应该是绝对的最后努力,因为如果你没有在30秒内完成这项工作,就会发生Armaggeddon.你应该首先重构你的代码.)
此外,你忘了调用[super dealloc]你的dealloc方法.