如果我的视图控制器中有变量
viewcontroller.m
@interface MemoryTestViewController : UIViewController
{
NSMutableArray *array;
}
@end
在我的实施中
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *aux = [[NSMutableArray alloc] initWithCapacity:1];
array = aux;
[aux release];
// Do i have to do array release?
}
我必须在某处释放我的变量数组吗?理论上我没有分配那个变量...... 我测试了内存泄漏,即使我没有释放任何东西,仪器也没有检测到任何泄漏。
答案 0 :(得分:3)
不,你不需要发布。您所做的只是将aux
的指针指定给array
变量。
在您发布array
时,aux
无效。
这可能不是预期的。如果您想使用array
,则必须保留它。
答案 1 :(得分:3)
您已经使用[aux release];
发布了数组 - 实际上您遇到了与泄漏相反的问题:过度释放。
Objective-C中的赋值只是指针的赋值;没有复制或自动memory management。当您说array = aux;
时,array
现在指向与aux
完全相同的对象。如果你通过释放aux
来释放它(因此让它被释放),array
就不再指向任何东西了。*
您有几种方法可以解决此问题:
(最简单)将新创建的数组直接分配给array
:
array = [[NSMutableArray alloc] initWithCapacity:1];
这为您提供了名为array
的新数组的所有权。在完成之前不要释放它(可能在dealloc
中;当然不在此方法中)。
(最佳)为array
创建declared property并让该机制为您处理内存管理:
@interface MemoryTestViewController : UIViewController
{
NSMutableArray *array;
}
@property (copy, nonatomic, setter=setArrayByMutableCopy) NSMutableArray * array;
@end
@implementation MemoryTestViewController
@synthesize array;
// Properties can't automatically make mutable copies, so you need to create
// your own setter method.
- (void) setArrayByMutableCopy: (NSMutableArray *)newArray {
NSMutableArray * tmp = [newArray mutableCopy];
[array release];
array = tmp;
}
...
*或者更确切地说,它指向一个曾经是有效对象的地方,这是使程序崩溃的好方法。
答案 2 :(得分:0)
您应该添加一个属性:
@property(nonatomic,retain)NSMutableArray * array;
以及稍后的viewDidLoad:
//错误,泄漏:self.array = [[NSMutableArray alloc] initWithCapacity:1];
array = [[NSMutableArray alloc] initWithCapacity:1];
是的,稍后稍后发布,可能是dealloc ..
答案 3 :(得分:0)
没有。将对象分配给变量不会保留它。但是,如果您打算暂时使用该变量,则应保留该变量并在完成后将其释放。
alloc
将保留计数器提升为 1 ,[aux release]
将其设置为 0