我需要使用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显示为崩溃点。
答案 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;
}