Objective-c简单记忆问题

时间:2011-09-27 20:35:36

标签: objective-c memory memory-management

如果我的视图控制器中有变量

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?
}

我必须在某处释放我的变量数组吗?理论上我没有分配那个变量...... 我测试了内存泄漏,即使我没有释放任何东西,仪器也没有检测到任何泄漏。

4 个答案:

答案 0 :(得分:3)

不,你不需要发布。您所做的只是将aux的指针指定给array变量。 在您发布array时,aux无效。 这可能不是预期的。如果您想使用array,则必须保留它。

答案 1 :(得分:3)

您已经使用[aux release];发布了数组 - 实际上您遇到了与泄漏相反的问题:过度释放。

Objective-C中的赋值只是指针的赋值;没有复制或自动memory management。当您说array = aux;时,array现在指向与aux完全相同的对象。如果你通过释放aux来释放它(因此让它被释放),array就不再指向任何东西了。*

您有几种方法可以解决此问题:

  1. (最简单)将新创建的数组直接分配给array

    array = [[NSMutableArray alloc] initWithCapacity:1];

    这为您提供了名为array的新数组的所有权。在完成之前不要释放它(可能在dealloc中;当然不在此方法中)。

  2. (最佳)为array创建declared property并让该机制为您处理内存管理:

  3. 
    @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