【问题标题】:Can I declare a non-public method in an Objective C Category, and if so, how?我可以在 Objective C 类别中声明一个非公共方法吗?如果可以,怎么做?
【发布时间】:2016-01-13 17:55:07
【问题描述】:

为了在我的应用程序中处理从 AFNetworking 库收到的 JSON 数据,我在文件 NSDictionary+JSON.h 中定义了 NSDictionary 上的一个类别:

@interface NSDictionary (JSON)
- (NSString *) name;
- (NSString *) extension;
...
@end

在我对这些方法的实现中,我想声明并使用一个我不想放在头文件中的辅助方法,因为它只是一个实现细节:

- (NSString *) valueForKeyFromDictionaryOrIndexes:(NSString *)key;

我的实现文件 NSDictionary+JSON.m 如下所示:

#import "NSDictionary+JSON.h"

@interface NSDictionary()
// Putting my method declaration here produces a warning.
...
@end


@implementation NSDictionary (JSON)

- (NSString *) valueForKeyFromDictionaryOrIndexes:(NSString *)key {

    NSString * value = [self valueForKey:key];

    // implementation details omitted

    return value;
}

- (NSString *) name {

    return [self valueForKeyFromDictionaryOrIndexes:@"Name"];
}

- (NSString *) extension {

    return [self valueForKeyFromDictionaryOrIndexes:@"Extension"];
}

...

@end

这很好用,所以从这个意义上说没有真正的问题。但是:我的辅助方法在定义之前从未被声明过。我对此感到有点不舒服。如果我将声明放在实现文件的 @interface ... @end 部分的注释位置(我认为这是声明非公共方法的正确位置),我会收到警告:

类别正在实现一个方法,该方法也将由其主类实现

我尝试通过替换来解决这个问题 @interface NSDictionary() 和 @interface NSDictionary(JSON) 但这当然给了我不同的警告:

接口“NSDictionary”上的类别“JSON”的重复定义

很公平,这确实与我的头文件中的相同,所以这不是一个合适的解决方案。这让我想知道:在类别实现中声明非公共方法的正确方法/位置是什么?

【问题讨论】:

  • 您需要为添加到框架类的方法加上前缀。

标签: ios objective-c


【解决方案1】:

根本不需要在@interface 中声明“私有”Obj-C 方法。

【讨论】:

  • 我注意到它本身并不需要 - 没有它也可以工作。我想我的问题更多:不是在 Objective C 中声明它被认为是正常/好的风格吗?
猜你喜欢
  • 2018-11-12
  • 2012-02-24
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2011-05-22
相关资源
最近更新 更多