1

我最近开始学习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];

当我打印这两个字符串的地址时,我看到这两个指针拥有相同的地址值。是因为它们拥有相同的值(我认为是空字符串),编译器决定将它们分配给相同的地址吗?或者是另一个问题?

4

2 回答 2

4

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

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

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

于 2012-12-11T17:50:17.530 回答
3

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

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

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

于 2012-12-11T17:52:52.193 回答