变量参数函数 - 调用[obj release]时的EXC_BAD_ACCESS;

时间:2010-05-17 20:24:21

标签: objective-c-runtime iphone

我有以下方法:

  

(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错误?

2 个答案:

答案 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。