2

J'ai un projet qui utilise le framework Core Telephony. Récemment mon code a cessé de travailler sur une catégorie CTCarrier, l'éditeur de liens se plaint qu'il ne peut pas trouver la classe CTCarrier:Le lieur ne trouve pas de classe qui devrait être disponible

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

Ceci est un exemple de code qui déclenche l'erreur ci-dessus:

#import <CoreTelephony/CTCarrier.h> 

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

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

Si je changer la catégorie à l'extension de classe, le code se construit soudainement:

#import <CoreTelephony/CTCarrier.h> 

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

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

Que se passe-t-il? Exemple de code on GitHub.

Répondre

0

Dans le premier exemple, vous n'implémentez pas réellement la classe CTCarrier mais seulement ajoutez une méthode à celle-ci. Les catégories fournissent un moyen d'ajouter des méthodes à une implémentation déjà définie.

+0

Je sais comment les catégories de travail, à moins je l'espère :) Le problème est que l'éditeur de liens se plaint qu'il ne peut pas trouver une classe à laquelle j'ajoute une catégorie. Lorsque je passe à une extension de classe au lieu de la catégorie, l'éditeur de liens arrête de se plaindre. C'est bizarre. – zoul

+0

La classe est implémentée dans un autre fichier .m? Je fais référence à '@implementation CTCarrier' –

+0

La classe 'CTCarrier' vient du framework Core Telephony. – zoul

1

Il y a un bogue dans 4.2 qui ne permet pas la création directe d'un objet CTCarrier, la bonne façon d'accéder CTCarrier est via l'objet CTTelephonyNetworkInfo comme ceci:

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

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