program tip

Xcode 8 Objective-C 카테고리 경고

radiobox 2020. 12. 5. 09:33
반응형

Xcode 8 Objective-C 카테고리 경고


Xcode 8과 Swift 3.0을 사용하고 있습니다. 이 오류 메시지는 무엇을 의미합니까?

ld : 경고 : 일부 개체 파일에는 호환되지 않는 Objective-C 범주 정의가 있습니다. 일부 카테고리 메타 데이터가 손실 될 수 있습니다. Objective-C 카테고리를 포함하는 모든 파일은 동일한 컴파일러를 사용하여 빌드해야합니다.


또한 UIColor확장 에서이 문제가 발생했습니다. 내 앱은 Objective-c를 사용하는 일부 프레임 워크를 제외하고 전적으로 신속하게 만들어 졌으므로 다음 var과 같이 선언하는 데 문제가 없습니다 @nonobjc.

extension UIColor {
   @nonobjc static var lol: UIColor {
      return UIColor.red
   }
}

애플 문서에서 :

nonobjc 속성은 Objective-C 코드에서 선언을 사용할 수 없도록 컴파일러에 지시합니다.

이 코드는 Objective-C에서 사용할 수 없기 때문에 경고가 사라집니다.


제 경우에는 확장에서 유형 속성을 계산 한 이유가 있습니다.

extension NSParagraphStyle {
    class var defaultStyle: NSParagraphStyle {
        return ...
    }
}

정확한 이유는 확실하지 않지만 경고를 없애기 위해 계산 된 유형 속성 ( class var)을 유형 메서드 ( class func) 로 변환해야했습니다 .

extension NSParagraphStyle {
    class func defaultStyle() -> NSParagraphStyle {
        return ...
    }
}

이 경고는 내 응용 프로그램에 Objective-C를 사용하는 프레임 워크를 추가 한 후 내 프로젝트에 나타났습니다.

이 경고가 사라질 모든 확장 에서 모든 정적 함수와 정적 변수 를 선언 합니다 .@nonobjc

예를 들면

extension Notification.Name {
    @nonobjc static let MyNotificationName = Notification.Name("NNSongFavoriteStatusDidChangeNotification")
}

또는

extension UIColor {
    @nonobjc static let superGiantRed = UIColor(red: 180.0/255.0, green: 40.0/255.0, blue: 27.0/255.0, alpha: 1.0)
}

Google Analytics 포드

에서 빌드 설정 -> 기타 링커 플래그는 당신이있는 경우에 -ObjC을-l "Google 웹" 이 경고가 나타납니다 플래그. 이유와 해결 방법은 모르겠지만 문제가 될 수도 있습니다.


제 경우에는 클래스 변수였습니다.

public extension NSObject {
    public class var nameOfClass: String{
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

@nonobjc 추가가 도움이되었습니다.


나에게 문제는 Xcode 8로 구축 된 Swift 3 애플리케이션에서 Xcode 7로 구축 된 공급 업체의 타사 프레임 워크를 사용하고 있었다는 것입니다. 프레임 워크는 컴파일 된 바이너리이기 때문에 공급 업체에 요청하는 것이 유일한 옵션이었습니다. 최신 버전의 Xcode로 구축 된 새로운 프레임 워크.


" class var "을 " class func "로 변경했을 때 문제를 해결할 수있었습니다 .

거기에 :

class var applicationVersionNumber: String {
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "Version Number Not Available"
}

되었습니다 :

class func applicationVersionNumber() -> String {
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "Version Number Not Available"
}

출처 : https://forums.developer.apple.com/message/146579#146579


각 구성원을 @nonobjc개별적으로 표시하는 대신 전체 확장을 @nonobjc다음 과 같이 표시 할 수 있습니다 .

@nonobjc extension UIStoryboard {
  static let main = UIStoryboard(name: "Main", bundle: nil)
  static let welcome = UIStoryboard(name: "Main", bundle: nil)
}

참고 URL : https://stackoverflow.com/questions/39665979/xcode-8-objective-c-category-warning

반응형