关于ios:为什么.m文件中还有另一个@interface?

Why is there another @interface inside the.m file?

本问题已经有最佳答案,请猛点这里访问。

有时我会看到另一个这样的接口声明:

1
2
3
@interface MyCode ()

@end

这不是在复制.h文件中的那个吗?


这是Xcode提供的一个类别,用于声明仅在此实现文件中可用的私有属性和方法。

您不会总是希望将类中的所有方法公开给外部世界,而是在这个私有类别中声明它们(我总是在这些私有方法前面加上下划线(_)以使我调用的是私有方法很明显,但这是完全可选的)。

例如,这里有一个我不希望公开的私有初始化方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@interface MyClass ()

- (BOOL)_init;

@end

@implementation MyClass

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self != nil)
    {
        if (![self _init])
            self = nil;
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:code];
    if (self != nil)
    {
        if (![self _init])
            self = nil;
    }
    return self;
}

- (BOOL)_init
{
     self.something = whatnot;
     self.thingA = self.thingB;
     return YES;
}

当您想要声明私有的ivar/properties/methods时使用它。


这是一个类扩展。多读

通常用于声明私有IVAR/属性/方法。


这个@interface允许您声明私有的ivar、属性和方法。所以您在这里声明的任何内容都不能从这个类之外访问。通常,除非类的一个实例需要访问它们,否则您希望将所有的ivar、属性和方法默认声明为private(在此@interface()中)。

希望这有帮助


概念是,如果将.h限制在类的公共接口上,然后在此类扩展中放置私有实现细节,则可以使项目更干净。请参阅《使用Objective-C编程指南》中有关私有类扩展的讨论。


在.h文件中,您有公共方法和属性,在.m文件中,您有私有的。