[ios] Xcode 9에서 “이 함수 선언은 프로토 타입이 아닙니다.”경고

Xcode 9를 사용할 때 This function declaration is not a prototype. void이를 해결할 메서드 본문 에 추가 할 것을 제안 합니다. 내가 겪고있는 문제는 이러한 경고가 UIApplication위임 방법 과 같은 시스템 API에 대해서도 발생한다는 것입니다 .

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

이 문제는 다음과 같이 해결할 수 있습니다.

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

이제 위임 메서드가 장기적으로 계속 작동하는지 아니면 Apple이 void이후 iOS 11 베타 버전에 삽입 할 것인지 궁금합니다 . void본문을 포함하면 Xcode가 불일치하는 메서드 선택자에 대해 불평 할 것이기 때문에 궁금 합니다. 누군가 지금까지 같은 문제를 경험 했습니까?



답변

빈 괄호가있는 블록 선언 :

void (^)()

빈 괄호가있는 함수 포인터와 동일한 의미를 갖습니다.

void (*)()

논쟁이 없다는 뜻은 아닙니다. 이는 인수가 지정되지 않았 음을 의미하므로 다음과 같은 방법으로 호출 할 수 있으므로 버그에 대한 길을 엽니 다.

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

매개 변수가없는 블록을 선언 할 때는 항상 다음을 사용하십시오.

void (^)(void)

Apple은 모든 곳에서 올바르게 수행하지 않았으며 호환성 이유로 인해 이전 API에 대해 수정하지 않았을 것입니다. 최신 API로 이동할 때까지 해당 경고를 계속 유지해야합니다.

해당 경고 ( -Wstrict-prototypes)를 끌 수도 있습니다 .
여기에 이미지 설명 입력

또는 사용 #pragma( @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

여기 에서 LLVM 토론 또는 openradar 의 버그를 참조하십시오 .

API의 내부 작업에는 변경 사항이 없으며 모든 코드는 계속 작동합니다. 우리는 API가 그다지 좋지 않다는 것만 알게 될 것입니다.


답변