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?