2013-06-12 3 views
1

Поскольку файлы .m для классов фундамента (например, для NSString) недоступны, я думал, могу ли я объявить расширение внутри файла .m категории, объявленной в том же классе. Мне удалось создать частный метод, который не использует переменную экземпляра внутри. Но когда я попытался получить доступ к iVar, объявленному внутри интерфейса, это вызвало проблемы.
* У этой цели не было цели, она просто пыталась что-то делать.Расширение для класса Foundation

Что я сделал объявить категорию на NSString:

NSString + TestInterface.h

@interface NSString (TestInterface) 
@end 

NSString + TestInterface.m

@interface NSString() { 

    NSString *myVar; 
} 
@property (strong) NSString *myVar; 
-(void)myPrivateMethod; 
@end 


@implementation NSString (TestInterface) 
-(void)myPrivateMethod{ 
    [email protected]"random"; 
// [self setValue:@"check" forKey:@"myVar"]; 

    NSLog(@"Private %@",myVar); 
// NSLog(@"Private %@",[self valueForKey:@"myVar"]); 
} 

@end 

Когда я это делаю таким образом, я получаю следующую ошибку компилятора:

Undefined symbols for architecture x86_64:
"_OBJC_IVAR_$_NSString.myVar", referenced from: -[NSString(TestInterface) myPrivateMethod] in NSSTring+TestInterface.o ld: symbol(s) not found for architecture x86_64

Может кто-нибудь сказать мне, что происходит?

ответ

2

Вы можете определить только новые переменные экземпляра, используя расширения класса в одной и той же единице перевода (файл), в которой находится первичная реализация класса ,. Это означает, что вы не можете эффективно добавлять переменные экземпляра в класс у вас нет исходного кода.

+0

Хорошо. Но почему 'setValue: ForKey:' выдает исключение, а 'valueForKey:' делает? – Rakesh

+0

@Rakesh IDK. Я только что попробовал, и для меня это вызвало исключение. –

+0

Могла быть моей небрежностью, она бросает и меня. Благодарю. – Rakesh

4

Вы не можете добавить переменные экземпляра в расширение/категорию внешнего класса, для которого вы не владеете реализацией (файл .m).

Возможно, вы можете добавить методы, которые действуют как сеттер и геттер. Для хранения acutal значений вы можете использовать objc_setAssociatedObject, который является своего рода глобальным хранилищем, где вы связываете значение с ключом и экземпляром объекта.

Здесь красиво объяснено, обсуждено и exaples Дано: What is objc_setAssociatedObject() and in what cases should it be used?

+0

Спасибо. Я не знал о 'objc_setAssociatedMethod'. +1 – Rakesh

Смежные вопросы