2

У меня есть проект, который использует базовую структуру телефонии. Недавно мой код перестал работать на CTCarrier категории, компоновщик жалуется, что не может найти CTCarrier класс:Linker не может найти класс, который должен быть там

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.

ответ

0

В первом примере вы действительно не реализуете класс CTCarrier, а добавляете к нему только метод. Категории предоставляют способ добавления методов к уже определенной реализации.

+0

Я знаю, как категории работы, в как я надеюсь, так :) Проблема заключается в том, что компоновщик жалуется, что не может найти класс, к которому я добавляю категорию. Когда я переключаюсь на расширение класса вместо категории, компоновщик перестает жаловаться. Это странно. – zoul 2010-11-25 11:46:23

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];