gpt4 book ai didi

objective-c - 在子项目中配置条件代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:19:42 25 4
gpt4 key购买 nike

我有一个项目有一个被导入的库子项目。我可以访问主项目和子项目的源代码。

子项目使用Core Text。因为子项目必须在 3.2 之前和之后的应用程序上使用,所以 Core Text 是弱链接,所有与 Core Text 相关的代码都包含在逻辑中:

#if defined(__CORETEXT__) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2

这行代码的思路是,如果没有链接CoreText,则跳过该代码。如果iPhone版本低于3.2;没有链接 CoreText。

这个目标的原因是主要项目(还有几个)并不都使用 Core Text,如果不使用,则没有 'defined(CORETEXT)` , 他们不会编译。

似乎 工作正常,并且在使用 Core Text 的项目上编译时没有错误。然而,在执行时,找不到代码,并出现类似“NSString 不响应 XXXX”的运行时错误(部分代码是 NSString 上的类别)。

有没有人遇到过这个?我的问题(由于是客户工作而部分含糊不清)是否清楚?

理想情况下,我想设置它,以便在主项目使用 Core Text 和不使用 Core Text 时不需要更改子项目。

请注意,__CORETEXT__ 是在 Core Text 框架的 header 中定义的。

问题更新

我已经尝试了到目前为止提供的建议,但它们是无效的。也许更多的代码将有助于概述问题。我有一个带有以下标题的类别:

@interface NSString (Internal)

- (NSString *)stringByUnescapingEntities;
- (NSString *)flattenHTML;
- (NSString *)flattenHTMLAndParseParagraphBreaks:(BOOL)parseBreaks;
- (NSString *)stringByEscapingForURL;
- (NSString *)stringByEscapingForJSON;

#if defined(__CORETEXT__) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
- (CFAttributedStringRef)attributedStringFromHTML;
- (CFAttributedStringRef)attributedStringFromHTMLWithBaseAttributes:(NSDictionary*)baseAttributes;
#endif

@end

阳性测试

#if block 之外的所有方法都可以完美运行。 #if 中的所有方法都编译 完美,没有警告。

阴性测试

如果我将 __CORETEXT__ 更改为 __THIS_IS_NOT_REAL__ 之类的内容,我将收到 block 内方法的编译错误。因此我知道,至少在编译时,__CORETEXT__ 标志已定义且功能齐全。

运行时问题

但是,当我去访问在#if block 内声明的方法之一时,我在运行时遇到以下错误:

-[NSCFString attributedStringFromHTMLWithBaseAttributes:]: unrecognized selector sent to instance 0x689c000

实例 0x689c000 是一个 NSString

如果我删除 __CORETEXT__ 逻辑检查,那么只要主项目使用 Core Text,一切都会正常进行。如果主项目未使用 Core Text,则会出现有关缺少链接器的编译错误。

希望这能澄清问题。

注意:所有项目都使用-all_load标志;因为 TouchXML 已经需要它了。

我已经创建了一个演示该问题的测试项目。

Test Project

最佳答案

事实上,你指出至少有一个最终丢失的东西是 NSString 的类别方法,这让我认为你遇到了一个可爱的问题,它似乎是链接器中可能存在的错误。

首先,参见this answer elsewhere并确保包括您的库在内的项目正在使用 -all_load 链接器标志。

其次,在我为 iPhone 使用 Three20 库的一些交易中,有必要也使用这种奇怪的“hack”,例如,如果您的 NSString 类别是 .m 文件中的唯一内容在哪里实现。

//CategoryBugHack.h
#define FIX_CATEGORY_BUG(name) @interface FIX_CATEGORY_BUG##name @end @implementation FIX_CATEGORY_BUG##name @end

然后类别.h/.m ...

//NSStringCategory.h
@interface NSString (MyAdditions)
// etc, etc
@end

//NSStringCategory.m
#import "CategoryBugHack.h"
FIX_CATEGORY_BUG(NSString_MyAdditions)
@implementation NSString (MyAdditions)
// etc, etc
@end

基本上似乎还有一个与静态库相关的额外问题,其中一个实现文件仅包含类别方法的实现。 FIX_CATEGORY_BUG 宏基本上只是扩展以定义一个接口(interface)和该接口(interface)的实现,没有任何方法,只是为了将不是类别的内容强加到 .m 文件中。

关于objective-c - 在子项目中配置条件代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3579165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com