NSString *string = @"someString" 与 NSString *string = [[NSString alloc] initWithFormat@"%@", string] 的区别

3
如果我有一个方法
- (void) myMethod:(NSString *)string {
    [Object anothermethodWithString:string];
}

我称之为

[Object myMethod:@"this is a string with no alloc statement"]

我需要做类似的事情吗?

- (void) myMethod:(NSString *)string {
    NSString *string2 = [[NSString alloc] initWithFormat:@"%@", string];
    [Object anothermethodWithString:string2];
    [string2 release];
}

我之前的myMethod方法是怎样的?我的代码出现了问题,似乎是在另一个方法中调用第二个方法时自动释放了字符串(就像例子中一样)。第二种修复myMethod的方式解决了我所有的问题。

所以,“non-alloc”字符串是自动释放的字符串吗?我问了这个问题作为对另一个无关问题的跟进,并且有一些来源说我不需要重新分配字符串。我感到困惑,因为我的代码行为告诉我相反。


你是否使用 newallocretaincopy 来创建字符串?如果没有,那么你不需要负责释放它。常量字符串 (@"") 是全局且永久的。 - Dave DeLong
不,我没有在传递到myMethod的字符串上调用任何这些方法。我的永久@""字符串似乎被覆盖了。 - Ayaka Nonaka
2个回答

4
戴夫说得对。你只需要担心在你使用newallocretaincopy创建的对象上调用release
上述规则非常有效,但如果您好奇并想深入了解,我建议阅读苹果文档中的内存管理编程指南。它是免费的,并从基本概念进入了许多细节。

2
如果您使用:NSString *str = @"". 它是一种常量,您不需要进行任何内存管理。
如果从方法调用:NSString *str = [NSString stringWithFormat:@""], 则str已经自动释放。
如果手动分配、初始化。您需要自己调用release或autorelease。
一般的内存约定是:如果您使用new、alloc、retain或copy操作,您需要自己释放它,其他情况下,对象会自动释放,不要释放它。

1
@vodkhang 这不是规则。规则是:如果用于创建对象的方法包含 newallocretaincopy 中的任何一个,则必须释放它。init 不在该列表中。你必须释放它,因为你使用了 alloc,而不是因为你使用了 init - Dave DeLong
1
@ayanonagon 通过 @"" 创建的字符串是常量字符串,不能被释放。它们存在于进程的全局内存部分,并将在 execexit 的过程中一直存在。 - Dave DeLong
@Dave DeLong 啊!这样就更有意义了。嗯,那么当我通过 @"" 在方法参数中创建一个字符串时会发生什么?它能在退出之前丢失吗? - Ayaka Nonaka
1
@Dave Delong:啊,是的,抱歉犯了错。有时候我会忘记这个规则,谢谢你提醒我。@ayanonagon:你怎么通过方法参数创建一个 @""?规则是该字符串存在且可以被运行时重复使用,但如果你没有指向它的指针,就不能直接获取它。 - vodkhang
@ayanonagon:你可以随意向一个常量字符串发送释放消息,它永远不会被释放。 - JeremyP
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接