我需要澄清内存管理概念。
我在.h
中声明了一个变量 @interface RootViewController : UIViewController
{
NSMutableArray *objMutableArray;
}
@property (nonatomic,retain) NSMutableArray *objMutableArray;
<。>文件中的
@implementation RootViewController
@synthesize objMutableArray=_objMutableArray;
- (void)viewDidload
{
[super viewDidload];
self.objMutableArray=[[NSMutableArray alloc]init];
[self.objMutableArray addObject:@"FirstRow"];
[self.objMutableArray addObject:@"SecondRow"];
[self.objMutableArray addObject:@"ThirdRow"];
[self.objMutableArray addObject:@"FourthRow"];
[self.objMutableArray addObject:@"FifthRow"];
}
我在所有地方都使用了self.objMutableArray。但是当我为该实例释放内存时,我使用了_objMutableArray。
- (void)dealloc
{
[_objMutableArray release];
[super dealloc];
}
实际上我在为该实例释放内存时感到困惑。请告诉我我做的正确或我必须发布“objMutableArray”对象。
答案 0 :(得分:2)
您似乎使用的是手动内存管理,而不是ARC。这很好,但你弄错了。
请告诉我我做对了或者我必须发布“objMutableArray”对象。
当然,您必须释放它,因为您使用alloc
创建了它。但你怎么做是不正确的。您正在泄漏内存,因为在viewDidUnload
方法中(我认为应该是viewDidLoad
而不是它!!)您正在分配给retain
属性 - 您的对象将具有引用计数为2(一个是因为+ alloc
,一个是因为(retain)
)。
现在当你在- dealloc
中发布它时,它仍然会有一个引用计数,所以你的类不会处置它的所有权,因此内存泄漏。
<强>解决方案:强>
您可以使用属性或实例变量。不要混淆两者。方法#1:
_objMutableArray = [[NSMutableArray alloc] init];
// ...
[_objMutableArray release];
方法#2:
self.objMutableArray = [[[NSMutableArray alloc] init] autorelease];
// ...
self.objMutableArray = nil;
答案 1 :(得分:0)
完成代码
- (void)viewDidLoad
{
[super viewDidLoad];
self.objMutableArray=[[NSMutableArray alloc]init];
......
......
}
使用
self.objMutableArray = [NSMutableArray array];
而不是
self.objMutableArray=[[NSMutableArray alloc]init];
我认为这个问题是already answered。
答案 2 :(得分:0)
此viewDidUnload
不应该是viewDidLoad
。由于您已经编写了@synthesize objMutableArray=_objMutableArray;
,因此如果您想直接访问此属性而不使用setter和getter。您必须使用_objMutableArray
。 dealloc [_objMutableArray release];
中的那一行会将对象保留计数减少一个,这样如果结果保留计数为0,则该对象将被释放。
答案 3 :(得分:0)
您可以阅读本文以更好地理解内存管理。