是否可以为类别声明第二个@interface?

时间:2012-03-12 09:45:03

标签: objective-c class categories

我正在尝试在.m文件中为某个类别声明私有@interface

对于正常的课程,我会这样做:

@interface ClassA ()

@end

@implementation ClassA

@end

它会很顺利。

对于我尝试过类别的课程:

@interface ClassA (CategoryA) ()

@end

@implementation ClassA (CategoryA)

@end

但它提供了各种不同的错误。我试图“扩展”一个类别,即通过这种语法@interface ClassA ()扩展类的方式。

我想拥有该类别的私有方法,我想知道,如果在暴露的接口中,我可以在.m文件中放置第二个类别@interface,它不会暴露实例类本身之外的变量和方法。

这样的事情:

ClassA的+ categoryA.h

@interface ClassA (CategoryA)

<some public methods>

@end

ClassA + categoryA.m文件

@interface ClassA (CategoryA)

<some private methods>

@end


@implementation ClassA (CategoryA)

<here I want to be able to call the private methods above>

@end

现在这是在Xcode中给我一个警告:

  

界面'ClassA'上类别'CategoryA'的重复定义

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:14)

不,您不能为单个类别声明两个接口。你可以做以下两件事之一:

昂格勒贝+ Humperdinck.h

#import "Englebert.h"

@interface Englebert (Humperdinck)

- (void) croon;

@end

您可以使用其他名称声明另一个类别以包含私有方法。然后可以在声明私有类别接口的同一文件中使用它们:

昂格勒贝+ Humperdinck.m

#import "Englebert+Humperdinck.h"

@interface Englebert (HumperdinckPrivate)

- (void) warmUp;

@end

@implementation Englebert (HumperdinckPrivate)

- (void)warmUp {
    NSLog(@"Warm up");
}

@end

@implementation Englebert (Humperdinck)

- (void)croon {
    [self warmUp];
    NSLog(@"Croon");
    // etc.
}

@end

另一种选择是不要声明私有方法。如果您只是在实现块中定义它们,则可以在定义它们之后在该文件中的任何位置使用它们(对于最新版本的Xcode / LLVM,顺序实际上并不重要 - 未声明的方法可以在任何地方使用它们被定义的文件)。没有其他文件能够看到这些方法。

昂格勒贝+ Humperdinck.m

#import "Englebert+Humperdinck.h"

@implementation Englebert (Humperdinck)

/* Undeclared private method */
- (void)warmUp {
    NSLog(@"Warm up");
}

- (void)croon {
    [self warmUp];
    NSLog(@"Croon");
    // etc.
}

@end

答案 1 :(得分:1)

待办事项

@interface ClassA (CategoryA)

@end

@implementation ClassA (CategoryA)

@end

相反。类别不能包含实例变量。你在说什么样的错误?

答案 2 :(得分:0)

@interface ClassA ()anonymous category,您可以将它们用作接口,并在ClassA实现中定义实现。 @interface ClassA (CategoryA) ()是语法错误,应该是@interface ClassA (CategoryA)

编辑:

要为类创建私有方法,请在该类“.m”文件中创建:

@interface ClassA ()
    // Private functions declared
@end

@implementation ClassA
    // Private functions defined
    // Other functions defined
@end

对于命名类别也可以这样做,但是您需要单独定义实现以避免警告。同样,在.m文件中:

@interface ClassA (hidden)
    // Private functions declared
@end

@implementation ClassA (hidden)
    // Private functions declared
@end

@implementation ClassA
    // Other functions defined
@end