崩溃枚举发送给方法iO的参数

时间:2014-10-21 13:05:46

标签: objective-c variadic-functions

我需要使用format方法创建一个自定义追加,以便在追加之前检查是否有任何参数为nil。

-(NSString *)customStringByAppendingFormat:(NSString *)format,...{
    NSLog( @" here self is %@",self);
    NSString *stringToAppend;

    va_list args;
    va_start(args, format);
    for (NSString *arg = format; arg != nil; arg = va_arg(args, NSString*)) // CRASH
    {
        if (arg == nil) {
            NSLog(@"NIL Arguments .");
            return self;
        }
    }
    va_end(args);

    va_start(args, format);
    stringToAppend = [[NSString alloc] initWithFormat:format arguments:args];
    va_end(args);
    NSLog( @" string to append is %@",stringToAppend);
    return [self stringByAppendingString:stringToAppend];
}

问题是,当我尝试枚举参数以检查它们中的任何一个是否为零时,这会崩溃...

这是什么问题?崩溃是EXC_BAD_ACCESS,并且调用跟踪将objc_StoreStrong和objc_Retain显示为崩溃点。

1 个答案:

答案 0 :(得分:1)

Haven已经完成了你的所有代码,但我认为你的' if'在你的'#for;不会被叫。

你的'如果'语句只有在arg为nil时才会运行,但是你的' for'只要arg不是零,循环条件就会运行 所以基本上如果arg是nil,那么' for'如果'言。

我不熟悉您使用的所有功能,
但我的猜测是,这是因为' for'如果arg为零,则循环中断,但是因为你的' if'语句没有被调用,你的函数不会返回并继续执行其余的代码。
我的猜测是,在' for'之后,您将nil传递给其中一个函数。循环,不接受nil作为参数。

也许尝试添加if(arg != nil)作为' for'之后代码的条件。环。

还尝试添加断点并准确查看导致崩溃的代码行。

编辑 -

仍然不确定它的作用,但也许尝试以这种方式构建它:

-(NSString *)customStringByAppendingFormat:(NSString *)format,...{
NSLog( @" here self is %@",self);
NSString *stringToAppend;

va_list args;
va_start(args, format);
for (NSString *arg = format; arg != nil; arg = va_arg(args, NSString*))  
{
    stringToAppend = [[NSString alloc] initWithFormat:format arguments:args];  
    NSLog( @" string to append is %@",stringToAppend);
    return [self stringByAppendingString:stringToAppend];
}
va_end(args);

return self;

}