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가 그다지 좋지 않다는 것만 알게 될 것입니다.