【发布时间】:2010-10-06 16:14:39
【问题描述】:
我已经阅读了一些关于此的帖子,但仍有一件事我不清楚。我知道这可能是一个相当n00b 的问题,但实际上我在没有完全掌握这个基本问题的情况下已经进入了相当长的发展阶段。我猜是自学的症状。
您在标题中声明一个变量,如下所示:
@interface SomeClass : NSObject {
NSMutableArray *anArray;
}
@property (nonatomic, retain) NSMutableArray *anArray;
end
然后在你的主文件中合成它并将其设置为初始值:
@implementation SomeClass
@synthesize anArray
- (SomeClass *)init{
if (self = [super init]) {
self.anArray = [[NSMutableArray alloc] initWithCapacity:10];
}
[return self];
当你的 Class 释放时释放它:
- (void)dealloc {
[anArray release];
[super dealloc];
}
现在,当我运行仪器时,这条线
self.anArray = [[NSMutableArray alloc] initWithCapacity:10];
被识别为内存泄漏。是否是内存泄漏,因为当您在标头中定义变量 anArray 时,它会分配内存? (因为我认为它是一个空指针。)因此,当您要初始化它并调用 [[NSMutableArray alloc] initWithCapacity:10] 时,您正在重新分配内存,并丢失指向原始分配的指针?
所以,我使用了便捷类方法:
@implementation SomeClass
@synthesize anArray
- (SomeClass *)init{
if (self = [super init]) {
self.anArray = [NSMutableArray arrayWithCapacity:10];
}
[return self];
这不再被识别为仪器中的内存泄漏。因为它是一种方便的方法,所以 anArray 是自动释放的。但是,如果我假设标题中的实例声明分配了内存,这可以解释上一个问题,那么我还应该释放 anArray 吗?以这种方式设置初始值是否会保留它?
我理解和
之间的区别NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:10];
和
NSMutableArray *anArray = [NSMutableArray arrayWithCapactiy:10];
但我不确定我是否理解当您在标题中声明 NSMutableArray *anArray 时,您应该使用两种方法中的哪一种以及为什么。而且无论是否使用第二种方法,在调用 dealloc 时仍应释放 anArray。
我可能会补充一点,我发现以下帖子/链接很有用:
【问题讨论】:
标签: iphone objective-c memory-management release-management