0

我的项目中声明了两个协议。我写的第一个名字是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,因为它们都是NSManagedObjects 并且两者之间存在联系?

4

1 回答 1

1

编译器编译 .m 文件,这些文件又包含 .h 文件。

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

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

In any case, it makes sense to include the required interfaces in the .h file (or forward declare the required classes), because that enables code-completion in Xcode.

于 2012-09-08T21:07:08.783 回答