未知类型名称'NSError'和其他问题

7

我不是完全的新手,但现在感觉自己像个新手。

我拿了一个现有的工作应用程序。它可以在Xcode 5下工作,现在也可以在Xcode 6下工作。编译和运行都没有问题。我在Xcode 6中启动了一个新项目,并开始使用我的工作应用程序的结构重建一个新的应用程序外壳。将其中所有我在每个应用程序中使用的标准库移植过来。我在Xcode 5下已经做过这几次了,没有任何问题。

但现在当我构建时,在特定库(TBXML)中出现了很多错误,但是即使我的其他工作项目中也有相同的库,我也没有得到任何这些错误。如果我把这些文件拿出来(因此不编译它们),就没有错误,应用程序可以正常启动。

我甚至还没有包含这个库。无论我是否包含,都会出现相同的错误。但是它们在“编译源”下列出,所以它们正在被编译。

这些错误是这样的:

....blah..../TBXML/TBXML-Headers/TBXML.h:124:49: 未知类型名称'NSError'

在这一行上:

typedef void (^TBXMLFailureBlock)(TBXML *tbxml, NSError *error);

在这一行中: /TBXML/TBXML-Headers/TBXML.h:126:71:未知类型名'NSString'
typedef void (^TBXMLIterateAttributeBlock)(TBXMLAttribute *attribute, NSString *attributeName, NSString *attributeValue);

在第133行:

/TBXML/TBXML-Headers/TBXML.h:133:20: 未找到“TBXML”的超类“NSObject”的接口声明

@interface TBXML : NSObject {

需要核对的项目:

  1. 我已经拥有了所有必要的框架,包括Foundation。
  2. 这些文件没有编译器标志——与旧项目匹配。
  3. 建立和目标iOS在两个项目中相同。
  4. 我不想使用“不要使用TBXML”,因为它在其他项目中运行良好。

我认为这可能是项目设置方面的差异,因为我的旧项目是在Xcode 5下创建的,而这个项目是在Xcode 6下创建的。但我已经到处寻找了。

*更新*

这似乎可以解决问题:TBXML in an iOS 8 extension fails to build

但我仍然想知道原因。问题仍然存在。为什么一个项目需要#include而另一个项目不需要呢?主要的区别是一个是在Xcode 5下创建的,另一个是在Xcode 6下创建的。但是现在两个项目都在Xcode 6中。


1
有一个设置可以确定文件是否自动包含 Foundation。但是我忘记它被埋在哪里了。 - Hot Licks
如果你能找到它,请将其发布为答案。我很想知道。 - badweasel
1个回答

23

前缀头文件!!!

感谢Hot Licks - 你带领我找到了答案。在我的旧项目中,我有这个:

Xcode Build Settings

而在新项目中我没有。那个文件的内容是:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

所以基本上每个文件都包含了Foundation和UIKit。因此在新项目中,有时会需要它们,但没有包含它们。也许苹果公司已经阅读了这篇文章:http://qualitycoding.org/precompiled-headers/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接