协议引用NSManagedObject子类时出现“未知类型名称”错误

时间:2012-09-08 20:51:24

标签: objective-c ios5 xcode4 protocols nsmanagedobject

我的项目中声明了两个协议。我写的第一个名为SSSelectingCategory.h

#import <Foundation/Foundation.h>

@protocol SSSelectingCategory <NSObject>

@required
@property (nonatomic, strong) SSCategory *selectedCategory;

@end

第二个是SSSelectingIcon.h

#import <Foundation/Foundation.h>

@protocol SSSelectingIcon <NSObject>

@required
@property (nonatomic, strong) SSIcon *selectedIcon;

@end

奇怪的是,第一个协议编译时没有任何错误或警告,而第二个协议正在抛出Unknown type name 'SSIcon'

我知道这个问题的答案是在我的第二个协议中使用前向声明,如下所示:

#import <Foundation/Foundation.h>
@class SSIcon;

@protocol SSSelectingIcon <NSObject>

@required
@property (nonatomic, strong) SSIcon *selectedIcon;

@end

但现在这让我认为SSSelectingCategory.h协议首先不应该编译,因为我没有放任何明确的#import或前向类声明。

我可以安静地编译器并继续编码,但是我想知道是否有一些奇怪的事情发生在Xcode上,或者我是否遗漏了一些细节,因为两种协议都非常简单。 SSCategory和/或SSIcon类是否存在问题,因为它们都是NSManagedObject并且存在将两者联系起来的关系?

1 个答案:

答案 0 :(得分:1)

编译器编译.m文件,后者又包含.h文件。

所以我假设在包含“SSSelectingCategory.h”的.m文件中,之前定义了SSCategory,因此编译器编译协议没有问题。

另一方面,如果在没有定义SSIcon的情况下包含“SSSelectingIcon.h”,编译器将在那里中止并出现错误。

在任何情况下,在.h文件中包含所需的接口(或转发声明所需的类)是有意义的,因为这样可以在Xcode中启用代码完成。