我想要做的是将类别的方法分为私有和公共方法。 私有方法需要在该类别的文件之外可见,但不能在该类之外显示。
例如,假设我有以下文件:
ClassA.m
ClassA.h // <-- Includes definitions of public category methods
ClassAPrivates.h // <-- Includes definition of private category methods.
ClassA+Render.m
ClassAPrivates.h
看起来像这样:
@interface ClassA()
// private methods here, for use inside ClassA
@end
@interface ClassA(Render)
// the private methods of the Render category.
-(void)privateConfigureDeviceContext;
-(void)privateConfigureBufferSpace;
@end
'ClassA.h'看起来像这样:
@interface ClassA : NSObject
// public methods of ClassA
@end
@interface ClassA (Render)
// public methods of category Render
-(void)drawLine;
-(void)drawCircle;
@end
然而,XCode抱怨Render的重复接口。任何解决方法?
答案 0 :(得分:1)
无需为私有方法创建单独的类别。
有三种情况:
ClassA+Render.m
访问ClassA.m
ClassA.m
访问ClassA+Render.m
ClassA+Render.m
访问ClassA.m
注意:虽然原始海报没有要求方案3,但我认为它可能会派上用场
示例强>
ClassA.m
定义了2个私有方法
basePrivateMethod1
- 这会调用renderPrivateMethod1
basePrivateMethod2
ClassA+Render.m
定义了2个私有方法
renderPrivateMethod1
renderPrivateMethod2
- 这会调用basePrivateMethod2
情景1
ClassA+Render.m
中,只需创建一个扩展名并转发声明您要使用的方法。<强> ClassA的+ Render.m 强>
@interface ClassA ()
- (void) basePrivateMethod1; //Just forward declare the method
@end
场景2
ClassA+Render.h
中,只需声明ClassA+Render.m
。ClassA.m
中只需添加(#import
)ClassA+Render.h
ClassA+Render.h
将/不应在ClassA
<强> ClassA的+ Render.h 强>
@interface ClassA (Render)
{
- (void) basePrivateMethod2;
}
场景3
ClassA+Properties
ClassA+Properties.h
重新声明所有属性ClassA+Properties.m
中使用@dynamic
为所有属性告诉编译器这些属性的实际定义是否在哪里ClassA+Render.m
包含(#import
)ClassA+Properties.h
,以便可以访问所有属性<强> ClassA的+ Properties.h 强>
@interface ClassA (Properties)
{
@property NSUInteger property1;
@property NSUInteger property2;
}
<强> ClassA的+ Properties.m 强>
@interface ClassA (Properties)
{
@dynamic property1;
@dynamic property2;
}
答案 1 :(得分:0)
您可以在自己的文件中的类扩展中声明Render的私有方法。这有利于您可以拥有多个类扩展。
ClassA.h
:
@interface ClassA : NSObject
// public methods of ClassA
@end
ClassA+Render.h
:
@interface ClassA (Render)
// public methods of category Render
-(void)drawLine;
-(void)drawCircle;
@end
ClassA+Render_Private.h
:
@interface ClassA ()
// the private methods of the Render category.
-(void)privateConfigureDeviceContext;
-(void)privateConfigureBufferSpace;
@end
答案 2 :(得分:0)
您在Render
上声明了两个名为ClassA
的类别。这就是Xcode抱怨的原因。
答案 3 :(得分:0)
类别是一个概念,它声明可以将任何新方法添加到现有类中,并且所有子类最终都将获得该方法。
您可以使用类别来定义现有类的其他方法 - 即使是源代码不可用的类 - 也可以不进行子类化。您通常使用类别将方法添加到现有类,例如Cocoa框架中定义的类。 添加的方法由子类继承,并且在运行时与类的原始方法无法区分。
如果您要添加私有方法,那么为什么要使用类别?因为它只能由单个类文件本身使用。因此,为什么不创建一个正常的私人方法!