ios programar Aviso "Esta declaração de função não é um protótipo" no Xcode 9



xcode 10.1 requirement (1)

A declaração do bloco com parênteses vazios:

void (^)()

tem a mesma semântica de um ponteiro de função com parênteses vazios:

void (*)()

Isso não significa que não há argumentos. Isso significa que os argumentos não são especificados, portanto, abre o caminho para erros, já que você pode chamá-lo das seguintes maneiras:

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

Ao declarar blocos sem parâmetros, use sempre:

void (^)(void)

A Apple não estava fazendo isso corretamente em todos os lugares e eles provavelmente não estão corrigindo isso para APIs antigas por razões de compatibilidade. Você terá que manter esse aviso até que você mude para a API mais recente.

Você também pode desativar esse aviso ( -Wstrict-prototypes ):

ou usando #pragma (obrigado @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

Veja a discussão do LLVM here ou o bug no openradar .

Note que não houve alteração no funcionamento interno das APIs, todo o código ainda funcionará. Saberemos apenas que a API não é tão boa quanto deveria.

Ao usar o Xcode 9, existem alguns avisos do compilador dizendo que This function declaration is not a prototype . Sugere adicionar void ao corpo do método, que irá resolvê-lo. O problema que estou tendo é que esses avisos também são lançados para os métodos delegados UIApplication da API do sistema:

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

Isso pode ser resolvido pelo seguinte:

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

Agora eu estou querendo saber se os métodos delegados ainda funcionem no longo prazo ou a Apple irá inserir o void em versões posteriores do iOS 11 Beta. Estou curioso, porque se eu incluir o corpo void , o Xcode irá reclamar de seletores de métodos incompatíveis (o que faz sentido). Alguém experimentou o mesmo problema até agora?





xcode9-beta