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]
它就行了.为什么?我不太了解内存管理,这让我很困惑.
这一行:
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)
归档时间: |
|
查看次数: |
254 次 |
最近记录: |