2011-07-04 13 views
7

Xcode miró esta línea y no se quejó. Proyecto construido, código bloqueado en tiempo de ejecución.Xcode. Pregunta sobre la comprobación de error de sintaxis

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

Naturalmente, vamos a pensar en ello, tengo una copa de más "%@" en su lugar, uno más de los argumentos reales. El código correcto debería verse de la siguiente manera

NSString *randomName = [NSString stringWithFormat:@"%@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

Aunque te pregunto ... ¿por qué Xcode no se quejó? Parece una cosa tan obvia que hacer con param counters. ¿No debería verificarse esto en tiempo de compilación? ¿Es específico para "%@", quizás?

Por favor, asesorar.

Respuesta

8

Basado en una comprobación rápida, tiene el 100% de razón de que esto no se comprueba en tiempo de compilación, aparentemente incluso con el analizador estático. Por el contrario, NSLog está marcado. Así que en mi máquina, con XCode 4.0.2, lo siguiente:

[NSString stringWithFormat:@"%d %@ %@"]; 
NSLog(@"%d %@ %@"); 

produce una advertencia en la NSLog de "Más conversiones '%' que los argumentos de datos", pero falla a comentar sobre el NSString.

Por lo tanto, la diferencia podría ser llamadas a funciones fijas frente a llamadas dinámicas. El compilador no puede estar completamente seguro de dónde irá la llamada NSString porque es posible que haya declarado una categoría o utilizado el tiempo de ejecución de bajo nivel para ajustar la tabla de selector de NSString en tiempo de ejecución.

Sin embargo, especialmente teniendo en cuenta los problemas que encontrará casi inmediatamente si comienza a modificar el comportamiento de las clases de Foundation, como usted, esperaba al menos una advertencia.