2010-07-22 56 views
1

这可能是一个更多关于对象alloc/retain/release的问题,但我将以NSString为例。我知道,我可以这样做:obj-c NSString和alloc/retain/release

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 

基本上分配和初始化由我mystring变量引用一个字符串,我应该再打[myString的发行]在。但是,如果我这样做之后,我把它设置为其他字符串,如:

myString = someOtherString; 

做,基本上创建一个内存泄漏,因为我已经重新分配我的指针到另一个对象,失去了所有参照原我分配了?

如果我只是想亲自分配和释放一个字符串,然后在不同时间更改它的值,我应该使用不同于'='的语法,或者是被重载的正确更改对象内容当我使用=时,最初由myString表示。

回答

4

是的,在你的例子中,你正在泄漏内存。

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 
myString = someOtherString; 

你应该这样做,像这样:

NSString* myString = [[NSString alloc] initWithString:@"Test"]; 
[myString release]; 
myString = someOtherString; 

我听到整个的最好办法留住描述/释放的是想像你是走的人狗。你的“物体”是一只狗,“保留”将一只狗带在狗身上,“释放”带走一根绳子。你可以根据自己的需要在狗身上安装任意数量的皮带,但是你希望至少有一条皮带扣在狗身上,这样他就不会自由奔跑(泄漏),并且一旦把它拿回来就想从狗身上取下所有的皮带给所有者(你想摆脱对象)。在你的例子中,你可以把它想象成放开狗的中间步行,并捡起另一只狗的皮带。

+0

没错,内存泄漏就像你的狗走路的客户干涸,随着字的传播,你不断失去人的狗。 – jasongetsdown 2010-07-22 20:23:01

+0

我认为你的比喻有点短,因为如果一个“皮带”就像一个参考数字,而只有一只狗“跑掉”,如果它的领子上没有皮带,那么我的例子就是不会拿起皮带不同的狗,放下我的皮带,转而看另一只狗。听起来像一个更正确的比喻将是没有持有牵引绳,以增加连接到灯柱或去除他们等皮带等,但谢谢澄清。 :) – Joey 2010-07-22 21:44:18

+0

Sheesh,每个人都是批评家...... ACBurk的解释很棒(程序员!) – pchap10k 2011-07-21 04:50:46

1

如果您分配另一个指针值前,正确地放弃所有权,不存在泄漏:

NSString *a = [[NSString alloc] init]; 
// ... 
[a release]; // relinquish ownership 
a = someOtherString; // fine, we don't own the previous instance anymore 

通过调用release放弃对象的所有权的那一刻,你应该考虑它有效地释放 - 这可能一直是它的最后一个参考。指针仍然具有相同的值仅仅是实现和使用Objective-C类类型的副作用。

根据存储限制和你的代码做了什么,你也可以使用autorelease d实例:

NSString *a = [NSString stringWithString:@"moo"]; 
a = someOtherString; // fine, a will be released later by the nearest autorelease pool 

注意,如果引用是不是一个局部变量,但伊娃,你可能会想改为使用declared properties

0

你可以做到以下几点:

NSString *myString = [NSString stringWithString:@"Test"]; 

返回的字符串会被自动释放,所以你不必释放它。你也不会“拥有”它。如果这是他人建议的问题,请在重新分配价值之前发送release消息至myString