为什么 Xcode 不能自动链接到只引用类别的模块?



我有一个模块,它包含一个类和使用该类的UIImageView上的一个类别。由于某些原因,如果我只引用代码中的类别,Xcode就不能自动链接到模块。

例如,我在UIImageView上有一个类别,它定义了方法setImageWithURL:

UIImageView *imageView = [UIImageView new];
[imageView setImageWithURL: [NSURL urlWithString:@"http://www.something.com/image.jpg"];

将崩溃,"无法识别的选择器发送到实例",但

FDImageLoader *completelyUselessReference = [FDImageLoader sharedInstance];
UIImageView *imageView = [UIImageView new];
[imageView setImageWithURL: [NSURL urlWithString:@"http://www.something.com/image.jpg"];

会很好用的。

如果你克隆我的模块,你可以在Xcode中看到这一点,https://github.com/reidmain/FDImageLoader,并打开示例iOS项目。在应用程序委派中,我对FDImageLoader有一个毫无意义的引用,但如果您将上面的代码复制并粘贴到应用程序委派,您可以看到崩溃。

有趣的是,如果我进入目标的构建阶段,并将FDImageLoader添加到"Link Binary With Libraries"部分,那么上面的两个示例都可以正常工作。Xcode似乎有某种魔力,如果它没有看到模块内引用的任何类,即使引用了模块中的类别,它也会完全省略模块。

您可以尝试使用-OjC链接器标志。

将-OjC选项传递给链接器会导致它加载所有成员实现任何Objective-C类或类别的静态库。这将拾取任何类别方法实现。但它可以所得到的可执行文件更大,并且可能拾取不必要的对象。因此,默认情况下不会启用。

https://developer.apple.com/library/mac/qa/qa1490/_index.html

最新更新