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

Jam*_*ght 0 iphone xcode memory-management objective-c

这是相关代码:

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];
Run Code Online (Sandbox Code Playgroud)

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

Bol*_*ock 6

这一行:

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];
Run Code Online (Sandbox Code Playgroud)

其后续行全部使用和方法NSString提供的自动释放s .您不应该手动释放,因为自动释放池将为您处理.stringWithFormat:stringByAppendingFormat:address

和这里:

NSString *response = [[NSString alloc] init];
response = [self getResponseFromWebAddress:address];
Run Code Online (Sandbox Code Playgroud)

您正在分配一个新的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
Run Code Online (Sandbox Code Playgroud)