使用手动内存管理,您的 -dealloc 方法如下所示:
-(void)dealloc
{
[objArray release]; // objArray *may* be nil, and this is
// sufficient to release all elements as well.
// call super at the end
[super dealloc];
}
此外,您的方法中存在潜在的内存泄漏-viewDidLoad
。如果你像你的例子那样做:
- (void)viewDidLoad
{
[super viewDidLoad];
objArray=[[NSMutableArray alloc]init];
}
即使已经拥有一个有效对象,您也可以分配一个新指针。新的指针值将简单地覆盖旧的,因此您不能再释放旧的。objArray
objArray
一种方法是检查是否objArray
不存在nil
,然后在为其分配新值之前释放它:
- (void)viewDidLoad
{
[super viewDidLoad];
if (objArray) {
[objArray release], objArray = nil;
}
objArray = [[NSMutableArray alloc]init];
}
然而,更好的方法是使用“延迟初始化属性”:
首先,为您的数组定义一个“内部属性”(除非您希望该数组可公开访问)。在您的 .m 文件中:
// In your implementation file define a private property in a class extension:
@interface SampleApp ()
@property (nonatomic) NSMutableArray* objArray;
@end
@implementation SampleApp
@synthesize objArray = _objArray; // this will create the setter
-(void)dealloc
{
[_objArray release];
[super dealloc];
}
// Lazy init property: (this is the getter)
- (NSMutableArray*) objArray {
if (_objArray == nil) {
_objArray = [[NSMutableArray alloc] init];
}
return _objArray;
}
- (void) viewDidLoad {
[super viewDidLoad];
// When needing the array, simply *and always* access it
// through the property "self.objArray":
NSUInteger count = [self.objArray count];
}
...
属性的延迟初始化非常方便。基本上,您不再担心它们是否已初始化 - 当您使用属性访问器时,它们只是。