我有以下方法:
(void)makeString:(NSString *)str1,... {
va_list strings; NSString *innerText = [[NSString alloc] init]; NSString *tmpStr = [[NSString alloc] init]; if (str1) { va_start(strings, str1); while (tmpStr = va_arg(strings, id)) { innerText = [innerText stringByAppendingString:tmpStr]; } label.text = [str1 stringByAppendingString:innerText]; } [tmpStr release];
}
我最终将进入Objective C Memory Management阅读,我相信我会找到答案 - 可能与指针和复制相关 - 但是现在,任何人都可以解释为什么我添加[innerText release] ;作为这个函数的最后一行,我在运行时得到一个EXC_BAD_ACCESS错误?
答案 0 :(得分:1)
首先,您的代码是错误的
据我所知,你只是连接字符串以将结果分配给label.text
我认为label
是一个ivar,所以label.text = …
是合法的。然后以下应该这样做:
- (void)makeString: (NSString *)str1, ...
{
if (str1) {
NSString *tmpStr;
va_list strings;
va_start(strings, str1);
while (tmpStr = va_arg(strings, id)) {
str1 = [str1 stringByAppendingString: tmpStr];
}
label.text = str1;
}
}
一些注意事项:
stringByAppendingString:
,否则不应发布label.text = str1
的结果
你以前保留过它。<强> [更新] 强>
我更改了答案,因为它包含错误。 str1
当然应该保留str1
(如果它想保留它)。特别是调用代码应该不保留{{1}},除非它想为自己保留它。
答案 1 :(得分:-1)
stringByAppendingString返回一个自动释放的字符串,它将替换您的原始分配。所以不需要你的发布。但是你正在使用上面的两个alloc泄漏内存。
你应该使用[NSString initWithCString:va_arg(strings,id)]来分配tmpStr。