【问题标题】:No Warning for conflicting category methods对冲突的类别方法没有警告
【发布时间】:2013-10-04 21:08:47
【问题描述】:

我正在运行 XCode 4.6.3 并尝试创建一个具有冲突类别方法的项目,如下所示。

//NSString+category1.h
@interface NSString (category1)

-(NSString*)foo;

@end

//NSString+category1.m
#import "NSString+category1.h"

@implementation NSString (category1)

-(NSString*)foo{
    return self;
}

@end


// NSString+category2.h
@interface NSString (category2)

-(NSString*)foo;

@end

//NSString+category2.m
#import "NSString+category2.h"

@implementation NSString (category2)

-(NSString*)foo{
    return self;
}

@end

XCode 4.6 应该给我一些警告,但事实并非如此。是否需要设置特殊的编译器/链接器标志?

【问题讨论】:

标签: ios objective-c compiler-construction linker


【解决方案1】:

根据Objective-C 编程指南中的Avoid Category Method Name Clashes

如果一个类别中声明的方法的名称与原始类中的方法名称相同,或者同一类(甚至超类)上的另一个类别中的方法名称相同,则行为未定义至哪个方法实现在运行时使用。 ...

...为了避免未定义的行为,最好在框架类的类别中为方法名称添加前缀,就像您应该为自己的类的名称添加前缀一样。您可以选择使用与您的类前缀相同的三个字母,但小写以遵循方法名称的通常约定,然后是下划线,在方法名称的其余部分之前。

归根结底,我相信开发人员有责任确保方法名称是唯一的。

【讨论】:

  • 问题是,Apple 广泛使用类别。例如 UIView(UIViewHierarchy) 声明属性“窗口”。如果您在 UIView 的子类中定义自己的窗口属性,则不会收到警告,因为编译器无法发现类别名称冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2012-07-25
  • 2021-06-20
相关资源
最近更新 更多