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

M.R*_*.R. 0 xcode objective-c ios

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

@interface MyCode ()

@end
Run Code Online (Sandbox Code Playgroud)

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

tro*_*foe 5

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

你并不总是希望将你的类中的所有方法暴露给外部世界,而是你会在这个私有类中声明它们(我总是在这些私有方法前加上下划线(_),以使它显而易见我调用了一个私有方法,但这完全是可选的).

作为一个例子,这里是一个我不想暴露的私有初始化方法:

@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;
}
Run Code Online (Sandbox Code Playgroud)