【问题标题】:Categories with the same function name in Objective C [duplicate]Objective C中具有相同函数名称的类别[重复]
【发布时间】:2013-03-03 15:39:21
【问题描述】:

如果一个 XCode 项目有两个类别:

@implementation NSData (test1)
- (void) testData {
     NSLog(@"test data 1");
} 
@end

@implementation NSData (test2)
- (void) testData {
     NSLog(@"test data 2");
} 
@end

这个的预期输出是什么:

NSData* testData = [[NSData alloc] init];
[testData testData];

我得到的输出总是

#import "NSData+test1.h"

对此有何解释?有没有办法强制第一类?

这里的问题是,如果您要导入两个具有相同名称类别的静态库的 SDK,您如何解决这个问题。我假设唯一的方法是要求 SDK 创建者为方法名称使用前缀?

【问题讨论】:

  • 您是否在同一个 .m 文件中导入了两个类别?
  • 该方法调用的结果未定义。不要永远运送这样的东西。

标签: ios iphone objective-c ipad


【解决方案1】:

该行为未定义,应避免。这是relevant documentation

避免类别方法名称冲突

因为在类别中声明的方法被添加到现有的 类,你需要非常小心方法名称。

如果类别中声明的方法名与方法名相同 在原始类中,或者在同一类的另一个类中的方法 类(甚至是超类),行为是不确定的 方法实现在运行时使用。这不太可能是 如果您在自己的类中使用类别,则会出现问题,但可能会导致 使用类别将方法添加到标准 Cocoa 或 Cocoa Touch 类。

【讨论】:

  • 未定义行为究竟是什么意思。如果我的目的正是这样,使用一个类别来覆盖类方法的现有行为呢?
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2014-10-16
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多