目标C同一类别的私有公共方法

时间:2012-12-07 08:45:23

标签: objective-c cocoa

我想要做的是将类别的方法分为私有和公共方法。 私有方法需要在该类别的文件之外可见,但不能在该类之外显示。

例如,假设我有以下文件:

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的重复接口。任何解决方法?

4 个答案:

答案 0 :(得分:1)

无需为私有方法创建单独的类别。

有三种情况:

  1. ClassA+Render.m访问ClassA.m
  2. 中定义的私有方法
  3. ClassA.m访问ClassA+Render.m
  4. 中定义的私有方法
  5. ClassA+Render.m访问ClassA.m
  6. 中定义的属性

    注意:虽然原始海报没有要求方案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中只需添加(#importClassA+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包含(#importClassA+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框架中定义的类。 添加的方法由子类继承,并且在运行时与类的原始方法无法区分。

如果您要添加私有方法,那么为什么要使用类别?因为它只能由单个类文件本身使用。因此,为什么不创建一个正常的私人方法!