gpt4 book ai didi

objective-c - Objective C 同一类别中的私有(private)公共(public)方法

转载 作者:行者123 更新时间:2023-12-03 17:55:49 25 4
gpt4 key购买 nike

我想做的是将类别的方法分为私有(private)方法和公共(public)方法。 私有(private)方法需要在该类别的文件外部可见,但在类外部不可见。

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

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 提示渲染接口(interface)重复。有什么解决方法吗?

最佳答案

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

有3种情况:

  1. ClassA+Render.m访问 ClassA.m 中定义的私有(private)方法
  2. ClassA.m访问 ClassA+Render.m 中定义的私有(private)方法
  3. ClassA+Render.m访问 ClassA.m 中定义的属性

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

示例

ClassA.m定义2个私有(private)方法

  • basePrivateMethod1 - 这将调用renderPrivateMethod1
  • basePrivateMethod2

ClassA+Render.m定义2个私有(private)方法

  • 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;
}

关于objective-c - Objective C 同一类别中的私有(private)公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13759662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com