为什么我不能发布这个NSString?

时间:2011-01-15 01:04:59

标签: iphone objective-c xcode memory-management

以下是相关代码:

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];
address = [address stringByAppendingFormat:@"%@", [defaultServer login]];
address = [address stringByAppendingFormat:@"?%@", [params urlEncodedString]];

NSString *response = [[NSString alloc] init];
response = [self getResponseFromWebAddress:address];

[response release];
[address release];

此代码在此处没有错误,但稍后在某些Apple库中会抛出“发送到解除分配的实例的消息”错误。但是,如果我注释掉[address release]行,它就可以了。为什么?我不太了解内存管理,这让我很困惑。

2 个答案:

答案 0 :(得分:6)

这一行:

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];

以下几行均适用于NSStringstringWithFormat:方法提供的自动释放的stringByAppendingFormat:。您不应该手动释放address,因为自动释放池将为您处理。

在这里:

NSString *response = [[NSString alloc] init];
response = [self getResponseFromWebAddress:address];

您正在分配新的NSString,然后立即将response变量指向另一个自动释放的字符串([self getResponseFromWebAddress:address])。分配的对象不再具有任何可用的指针,因此您不能再释放它,因此它会泄漏。

要解决这两个问题,请删除alloc-init行和版本行。您的address字符串也可以只使用一个语句进行初始化:

// Combine all three arguments into one format string
NSString *address = [NSString stringWithFormat:@"%@%@?%@", 
                        [defaultServer root], 
                        [defaultServer login], 
                        [params urlEncodedString]];

NSString *response = [self getResponseFromWebAddress:address];

// No need to release either variable

答案 1 :(得分:2)

记住NARC(新的,分配,保留,复制)规则。 只有当对象由其中一条消息创建时,才必须释放该对象。 否则该对象将被自动释放。