Objective C基本内存问题

时间:2012-12-11 17:42:56

标签: objective-c memory

我最近开始学习Objective C,我对一些基本的内存问题感到困惑。例如,我在教程中看到过:

- (void) setVin: (NSNumber*)newVin {  
    [vin release];  
    vin = [[NSNumber alloc] init];  
    vin = newVin;  
}  

首先,我为vin分配一个空间,然后我将它分配给newVin。那么为vin分配新空间的重点是什么。分配后,它不会泄漏吗?

另一件事是

NSString* s1 = [[NSString alloc] init];
NSString* s2 = [[NSString alloc] init];

当我打印这两个字符串的地址时,我发现这两个指针的地址值相同。是因为它们保持相同的值(我认为是空字符串),编译器决定将它们分配到同一个地址?还是另一个问题?

2 个答案:

答案 0 :(得分:4)

这是非常糟糕的教程,因为那里肯定存在内存泄漏。正确的变体是

-(void) setVin: (NSNumber*)newVin {  
    if( newVin != vin ) {
         [vin release];
         vin = [newVin retain];
    }
}

至于第二种情况,NSString是不可变的,并且可能在内部缓存了一些值。因此返回保留计数增加的相同值。

答案 1 :(得分:3)

您的第一个示例来自ARC之前的教程(即禁用自动引用计数)。在ARC中,您无需在重新分配时调用release

绝对没有理由像这样分配vin,不管ARC。没有ARC,这是一个泄漏;使用ARC,这是一项不必要的操作。

您的第二个示例说明NSString是不可变的这一事实。由于两个调用都创建了空字符串,因此Cocoa返回相同的对象,因为知道该对象无法修改。