Xcode 8 Objective-C 类别警告
Posted
技术标签:
【中文标题】Xcode 8 Objective-C 类别警告【英文标题】:Xcode 8 Objective-C category warning 【发布时间】:2017-02-01 14:55:01 【问题描述】:我正在使用 Xcode 8 和 Swift 3.0。这个错误信息是什么意思?
ld:警告:某些目标文件具有不兼容的 Objective-C 类别定义。某些类别元数据可能会丢失。所有包含 Objective-C 类别的文件都应使用相同的编译器构建。
【问题讨论】:
看到这个github.com/Carthage/Carthage/issues/1482和这个forums.developer.apple.com/thread/49618 谢谢。我实际上在发布之前看到了这些。他们没有答案。 您是否扩展了警告信息?通常在该行的最右侧有一个图标,它将展开消息并让您查看命令行调用和结果。 @MobileBen 是的,谢谢。我在那里没有看到任何有用的东西。 刚得到这个......这里没有任何东西可以工作:/ 【参考方案1】:我在 UIColor
扩展中也遇到了这个问题,我的应用程序完全是用 swift 制作的,除了一些使用 Objective-c 的框架,所以我将 var
声明为 @nonobjc
没有问题:
extension UIColor
@nonobjc static var lol: UIColor
return UIColor.red
来自苹果文档:
nonobjc 属性告诉编译器使声明在 Objective-C 代码中不可用...
由于 Objective-C 无法使用此代码,因此警告消失了。
【讨论】:
我必须将@nonobjc 添加到目标中使用的所有扩展中的所有类和静态变量中。只有在该警告消失后。 该死的我试图使用正则表达式来查找所有具有静态属性的扩展,但是 Xcode ? 本身【参考方案2】:在我的例子中,原因是扩展中有计算类型属性:
extension NSParagraphStyle
class var defaultStyle: NSParagraphStyle
return ...
不确定这背后的确切原因是什么,但为了摆脱警告,我必须将计算类型属性 (class var
) 转换为类型方法 (@987654323 @):
extension NSParagraphStyle
class func defaultStyle() -> NSParagraphStyle
return ...
【讨论】:
我正在尝试使用 UIColor 的扩展来拥有我自己的一组颜色。它们必须是函数吗?在以前的 Swift 版本中,你有 UIColor.whiteColor(),但现在它是 UIColor.white。我想要 UIColor.myColor。知道如何实现吗? 您可以根据需要忽略警告,一切正常。但不确定您是否可以使用 ObjC 代码中的该属性。 @Hejazi 有没有办法抑制这个警告?或者说忽略警告,你的意思是假装你没有看到它? @Ismail AFAIK,没有办法在 Swift 中抑制警告。我的意思是你可以暂时忽略这个警告(直到 Apple 修复了一个似乎是 swift 编译器的错误),或者像我之前所说的那样使用类型方法而不是计算类型属性。 我看到了这个警告并找到了这个答案。我怀疑它是否对我有用,因为警告似乎与答案无关,但答案修复了警告。【参考方案3】:在我的应用程序中添加了一个使用 Objective-C 的框架后,这个警告出现在我的项目中,否则它完全使用 Swift 3。
通过将所有扩展中的所有静态函数和静态变量声明为@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)
【讨论】:
【参考方案4】:谷歌分析 pod
如果您在 -l"GoogleAnalytics" 标志上有 -ObjC,则在 Build Settings -> Other Linker Flags 中会出现此警告。我不知道为什么或如何解决,但也可能是您的问题。
【讨论】:
@Raniys 不,我的朋友,我认为这将在谷歌更新他们的存储库时得到解决。如果您删除 -ObjC 标志,警告就会消失,但我不知道可能导致您的项目的问题 @Raniys 你好,我的朋友,我注意到在我的 pod 安装之后,出现了这个警告 "[!]project[Debug]
目标覆盖了在 `podsFolder. xcconfig'。这可能会导致 CocoaPods 安装出现问题"。当我更正此警告时,在我的构建设置中,XCode 警告消失了。【参考方案5】:
在我的例子中,它是一个类变量。
public extension NSObject
public class var nameOfClass: String
return NSStringFromClass(self).components(separatedBy: ".").last!
添加@nonobjc 有帮助。
【讨论】:
【参考方案6】:对我来说,问题是我在使用 Xcode 8 构建的 Swift 3 应用程序中使用了使用 Xcode 7 构建的供应商提供的第三方框架。因为该框架是编译后的二进制文件,所以我唯一的选择就是询问我的供应商提供使用最新版本 Xcode 构建的新框架。
【讨论】:
你能告诉我们它是哪个库吗? @allaire 这是 Adobe 的专有 SDK。 啊太糟糕了。我面临着类似的问题,但我没有动力一一删除 pod :( @allaire 这个问题应该只发生在预构建的框架中。如果你有任何 cocoapods 的源代码(pod 是从源代码构建的),你可以排除这些,因为你知道它们是用你正在使用的最新版本的 Xcode 构建的 我怀疑 Cocoapods 中的静态库(如 Google Analytics)【参考方案7】:当我将“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
【讨论】:
【参考方案8】:您可以将整个扩展标记为@nonobjc
,而不是将每个成员单独标记为@nonobjc
:
@nonobjc extension UIStoryboard
static let main = UIStoryboard(name: "Main", bundle: nil)
static let welcome = UIStoryboard(name: "Main", bundle: nil)
【讨论】:
以上是关于Xcode 8 Objective-C 类别警告的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 内存警告 - 无法加载任何 Objective-C 类信息
Xcode 7.3 / Swift 2:“没有使用 Objective-C 选择器声明的方法”警告