1

这可能是一个更多关于对象分配/保留/释放的问题,但我将使用 NSString 作为示例。我知道我可以做到:

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

本质上分配和初始化我的变量 myString 引用的字符串,稍后我应该调用 [myString release] 。但是,如果在我这样做之后,我将其设置为其他一些字符串,例如:

myString = someOtherString;

这是否本质上会造成内存泄漏,因为我已将指针重新分配给另一个对象并丢失了对我分配的原始对象的所有引用?

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

4

3 回答 3

4

是的,在您的示例中,您正在泄漏内存。

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

你应该这样做:

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

我听到描述的整个保留/释放的最佳方式是想象你正在为某人遛狗。您的“对象”是一条狗,“保留”为狗系上皮带,而“释放”则脱下皮带。您可以根据需要在狗身上系上尽可能多的皮带,但您希望至少在狗身上保留一条皮带,这样他就不会自由奔跑(泄漏),并且一旦您将狗带回来,您就想将所有皮带从狗身上取下给所有者(您想摆脱该对象)。在您的示例中,您可以将其视为在步行途中松开狗的皮带并拿起另一只狗的皮带。

于 2010-07-22T19:54:04.193 回答
1

如果您在为其分配另一个指针值之前正确放弃了所有权,则不会发生泄漏:

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

通过调用 放弃对象所有权的那一刻release,您应该认为它已被有效地释放 - 这可能是对它的最后一次引用。指针仍然具有相同的值只是 Objective-C 类类型如何实现和使用的副作用。

根据内存限制和代码的作用,您还可以使用autoreleased 实例:

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

请注意,如果引用不是局部变量而是 ivar,您可能希望使用已声明的属性

于 2010-07-22T19:44:34.987 回答
0

您可以执行以下操作:

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

返回的字符串是自动释放的,因此您不必释放它。你也不“拥有”它。如果这是一个问题,请按照其他人的建议进行操作,并在重新分配其价值之前向其发送release消息。myString

于 2010-07-22T20:11:31.593 回答