NSString * string = @“someString”vs NSString * string = [[NSString alloc] initWithFormat @“%@”,string]

时间:2010-07-17 03:06:44

标签: iphone objective-c nsstring memory-management

如果我有方法

- (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”字符串是一个自动释放的字符串吗?我问这个问题是对另一个问题的跟进(这完全不相关,也就是我创建这篇文章的原因),有几个消息来源说我不需要重新分配字符串。我很困惑,因为我的代码的行为告诉了我。

2 个答案:

答案 0 :(得分:4)

戴夫说得对。您只需要担心在releasenewallocretain的对象上调用copy

上述规则运作良好,但如果您很好奇并希望详细介绍,我建议您阅读Apple的文档中的Memory management Programming Guide。它是免费的,从基本概念到很多细节。

答案 1 :(得分:2)

如果您使用:NSString * str = @“”。它是一种常量,你不需要做任何内存管理。

如果从方法调用:NSString * str = [NSString stringWithFormat:@“”],则str已经自动释放。

如果你手动分配,init。您需要致电发布,或自行自动发布。

一般的内存约定是:如果你使用new,alloc,retain或copy做某事,你需要自己发布,任何其他情况下,对象是自动释放的,不要释放它