在我的iOS应用程序中,我有5个视图控制器,它们都处理相同的功能(组)。可以在几种不同的配置中将这些视图控制器推到彼此之上。我创建了一个名为GroupViewHelper.h的文件,它使用@implementation为组功能提供一些功能。这些函数通过视图控制器堆栈查看,并向特定类型的视图控制器发送“刷新”消息。该文件如下所示:
@implementation UIViewController (GroupViewHelper)
- (void) refreshManageGroupsParent
{
// ...
}
- (void) refreshGroupDetailsParent
{
// ...
}
@end
我的代码运行良好,一切都按预期运行,但我在构建时收到14个与此非常相似的警告:
ld: warning: instance method 'refreshGroupDetailsParent' in category from /Users/x/Library/Developer/Xcode/DerivedData/myapp-ayshzmsyeabbgqbbnbiixjhdmqgs/Build/Intermediates/myapp.build/Debug-iphonesimulator/myapp-dev.build/Objects-normal/i386/GroupMembersController.o conflicts with same method from another category
我想我得到的是因为我使用的是.H,它包含在多个地方,但在这种情况下如何正确使用@implementation?
答案 0 :(得分:6)
我想我得到的是因为我正在使用包含在多个地方的.H
嗯,有点,但真正的问题是你首先将@implementation
放在.h
文件中。如果您只将.h
文件包含在一个位置,那么您可以放弃它 - 但它仍然不是正确的方法。
但在这种情况下如何正确使用@implementation?
将其放入名为GroupViewHelper.m
的文件中,并将该文件添加到项目的来源中,并将@interface
放入GroupViewHelper.h
。
或者,理想情况下,将其称为UIViewController+GroupViewHelper.m
和UIViewController+GroupViewHelper.h
,因为这是命名类别文件的惯用方法。 (如果你使用Xcode的“New File ...”菜单项来创建一个新的Objective-C类别文件,那就是它给你的东西。)
换句话说,现有类的类别的接口和实现与新类的接口和实现完全相同。
答案 1 :(得分:1)
我遇到了这个问题。我在.m页面上导入了对头文件的引用。但是,它还包含对另一个头文件的引用,该头文件包含对另一个头文件的引用 - 该引用文件也引用了冲突的头文件。因此间接导入相同的头文件两次,导致错误。
就我而言,.m文件不需要此引用。我能删除它,删除错误。我的建议是检查你已经包含对有问题的头文件的引用的文件,并验证它实际上是否是必需的。