xip descargar apple ios objective-c xcode ios11 xcode9-beta

ios - descargar - xcode 10 xip



Advertencia "Esta declaraciĆ³n de funciĆ³n no es un prototipo" en Xcode 9 (1)

La declaración de bloque con paréntesis vacío:

void (^)()

tiene la misma semántica que un puntero de función con paréntesis vacío:

void (*)()

No significa que no haya argumentos. Significa que los argumentos no están especificados, por lo tanto, abre el camino a los errores, ya que puede llamarlo de las siguientes maneras:

void (^block)() = ... block(); block(10); block(@"myString");

Al declarar bloques sin parámetros, use siempre:

void (^)(void)

Apple no lo estaba haciendo correctamente en todas partes y probablemente no lo están arreglando para las API antiguas por razones de compatibilidad. Deberá mantener esa advertencia allí hasta que pase a la API más nueva.

También puede desactivar esa advertencia ( -Wstrict-prototypes ):

o usando #pragma (gracias @davidisdk ):

#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wstrict-prototypes" - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler { } #pragma clang diagnostic pop

Vea la discusión sobre LLVM here o el error en openradar .

Tenga en cuenta que no hubo cambios en el funcionamiento interno de las API, todo el código seguirá funcionando. Solo sabremos que la API no es tan buena como debería ser.

Cuando se usa Xcode 9, hay algunas advertencias del compilador que dicen que This function declaration is not a prototype . Sugiere agregar void al cuerpo del método, lo que lo resolverá. El problema que tengo es que esas advertencias también se lanzan para las API del sistema como los UIApplication delegados de aplicación UIApplication :

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler

Esto podría resolverse de la siguiente manera:

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)(void))completionHandler

Ahora me pregunto si los métodos de delegado seguirán funcionando a largo plazo o si Apple insertará el void en versiones posteriores de iOS 11 Beta. Tengo curiosidad porque si incluyo el cuerpo void , Xcode se quejará de los selectores de métodos que no coinciden (lo cual tiene sentido). ¿Alguien experimentó el mismo problema hasta ahora?