0

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

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

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

4 回答 4

1

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

有3种情况:

  1. ClassA+Render.m访问定义在ClassA.m
  2. ClassA.m访问定义在ClassA+Render.m
  3. ClassA+Render.m访问定义在ClassA.m

注:虽然原贴没有要求场景3,但我认为它可能会派上用场

例子

ClassA.m定义了 2 个私有方法

  • basePrivateMethod1- 这将调用renderPrivateMethod1
  • basePrivateMethod2

ClassA+Render.m定义了 2 个私有方法

  • renderPrivateMethod1
  • renderPrivateMethod2- 这将调用basePrivateMethod2

方案 1

  • ClassA+Render.m只需创建一个扩展并转发声明您要使用的方法。

A类+渲染.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+渲染.h

@interface ClassA (Render)
{
    - (void) basePrivateMethod2;
}

方案 3

  • 请注意 - 无法在类别中定义/创建属性
  • 因此,创建一个名为的新类别ClassA+Properties
  • ClassA+Properties.h重新声明所有属性
  • ClassA+Properties.m用于@dynamic所有属性时告诉编译器这些属性的实际定义在 else where
  • ClassA+Render.minclude( #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;
}
于 2013-01-25T02:13:07.567 回答
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
于 2012-12-07T08:51:48.103 回答
0

您声明了两个名为Renderon 的类别ClassA。这就是 Xcode 抱怨的原因。

于 2012-12-07T09:09:40.297 回答
0

类别是一个概念,它表明任何新方法都可以添加到现有类中,并且所有子类最终都将获得该方法。

您可以使用类别来定义现有类的其他方法——即使是您无法获得源代码的类——而无需子类化。您通常使用类别将方法添加到现有类,例如在 Cocoa 框架中定义的类。添加的方法由子类继承,并且在运行时与类的原始方法无法区分。

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

于 2012-12-07T09:29:36.120 回答