2012-12-07 71 views
0

我想要做的是将类别的方法分为私有和公共方法。 私有方法需要在该类别的文件之外可见,但不在课堂之外。目的C同一类别中的私有公共方法

举例来说,假设我有以下文件:

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有重复的界面。任何解决方法?

回答

1

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

有3种方案:

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

注意:虽然原来的海报并没有要求方案3,我想这可能派上用场

ClassA.m定义2种私有方法

  • basePrivateMethod1 - 这将调用renderPrivateMethod1
  • basePrivateMethod2

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

  • renderPrivateMethod1
  • renderPrivateMethod2 - 这将调用basePrivateMethod2

方案1

  • ClassA+Render.m只是创建一个延伸和向前declar e您想要使用的方法。

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的+渲染使用。^ 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; 
} 
+0

我会老实说,我早就放弃了在iOS上使用Objective-C来支持C++ 11。话虽如此,我已经多次阅读您的解决方案,虽然您可能已经找到了一个解决方案,给出了一个简单的例子,但我不相信它仍然有效,如果有'ClassA + Clear.m'由于多个匿名类别定义('@interface ClassA()'),所以抛出它。 –

+0

我已经在有多个类别的项目中使用过它。 '@interface ClassA()'在.m(多个)文件中使用,并且仅用于重新声明内容,它不重新定义内容。所以,当链接器链接所有的目标文件时,会有一个方法的定义。当您想要在另一个类别中使用一个类别的方法时,只需在想要使用它的类别的.m文件中导入该类别的标题。 – user1046037

+0

您可以像声明或extern变量一样声明任意次数,只会有一个定义(实现),所以没关系。 – user1046037

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 
+0

哎呀,我只注意到我使用'Raster'和'Render'作为单独的词时,他们的目的是要两者是同一个词,我编辑我的职务,以解决这个问题。在你的答案中,你已经将'ClassA + Raster.h'和'ClassA + Render.h'作为单独的文件>< –

+0

我担心我可能需要做的是制作一个'PrivateRender'类别, 'PublicRender'类别。但是,我已经有很多类别,并且这会实际上将该数字翻倍。 –

0

您申报两类命名RenderClassA。这就是Xcode抱怨的原因。

+0

这就是为什么它在抱怨,但你能看到我试图完成什么? “渲染”类别的定义之一只包含公共方法,而“渲染”类别的另一个定义仅包含私有方法。我需要能够分开范围。如果他们必须公开或全部保密,这似乎是该语言的一个弱点。 –

+0

我相信我看到了你的目标,并且我会分享你的愿望,以避免类别泛滥而仅限于范围,但为什么类别的私有方法需要在类别界面中可见?例如,“ClassA(渲染)”的私有方法需要在哪里可见? – FluffulousChimp

+0

为什么'Render'的私有方法需要在所有'ClassA'中都可见?因为还有其他类别(例如'RenderSphere'),它们使用某些类别为“Render”的私有方法。换句话说,'RenderSphere'可能需要调用'privateConfigureBufferSpace'作为它的球形伪装。 –

0

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

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

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

+0

对于您从[上分类苹果文档(http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html)省略了第二天一句: '使用类别,你也可以在几个文件中分配你自己的类的实现。' –

+0

但私人不会被分配,也不会继承! –

相关问题