以下是相关代码:
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]
行,它就可以了。为什么?我不太了解内存管理,这让我很困惑。
答案 0 :(得分:6)
这一行:
NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];
以下几行均适用于NSString
和stringWithFormat:
方法提供的自动释放的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(新的,分配,保留,复制)规则。 只有当对象由其中一条消息创建时,才必须释放该对象。 否则该对象将被自动释放。