我最近开始学习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];
当我打印这两个字符串的地址时,我发现这两个指针的地址值相同。是因为它们保持相同的值(我认为是空字符串),编译器决定将它们分配到同一个地址?还是另一个问题?
答案 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返回相同的对象,因为知道该对象无法修改。