链接器找不到应该存在的类

时间:2010-11-25 09:56:00

标签: objective-c linker categories core-telephony class-extensions

我有一个使用Core Telephony框架的项目。最近我的代码停止了CTCarrier类别的工作,链接器抱怨它无法找到CTCarrier类:

Undefined symbols:
  "_OBJC_CLASS_$_CTCarrier", referenced from:
      l_OBJC_$_CATEGORY_CTCarrier_$_Foo in CTTests.o
ld: symbol(s) not found

这是触发上述错误的示例代码:

#import <CoreTelephony/CTCarrier.h>

@interface CTCarrier (Foo)
- (void) doFoo;
@end

@implementation CTCarrier (Foo)
- (void) doFoo {}
@end

如果我将类别更改为类扩展,则代码会突然生成:

#import <CoreTelephony/CTCarrier.h>

@interface CTCarrier ()
- (void) doFoo;
@end

@implementation CTCarrier
- (void) doFoo {}
@end

发生了什么事?示例代码on GitHub

2 个答案:

答案 0 :(得分:1)

4.2中有一个错误,它不允许直接创建CTCarrier对象,访问CTCarrier的正确方法是通过CTTelephonyNetworkInfo对象,如下所示:

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>

CTTelephonyNetworkInfo *telephony = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = telephony.subscriberCellularProvider;
[telephony release];

答案 1 :(得分:0)

在第一个示例中,您实际上并没有实现CTCarrier类,只是添加了一个方法。这些类别提供了一种向已定义的实现添加方法的方法。