#objective-c
#objective-c
Вопрос:
Что делает следующее приведение self для «ClassA *»? Позволяет ли вам эта каста типов получать доступ к ClassA? ClassA.h:
@interface ClassA: NSObject {
NSUInteger _someNumber;
ClassB *_classB;
}
@property (nonatomic,retain) ClassB *classB;
@property (nonatomic,assign) NSUInteger someNumber;
Метод ClassB:
-(void) classBMethod {
[(ClassA*)self setSomeNumber:5];
}
Комментарии:
1. является ли ClassB подклассом ClassA?
2. @Cory Powers: Даже тогда приведение не должно быть необходимым, если
someNumber
оно не затеняется. И если это свойство затеняется, это совершенно новая проблема…3. Возможно, ClassA является подклассом ClassB, но тогда ClassB, вероятно, не должен знать о ClassA.
4. @BoltClock Я надеялся дать ему другой вариант в моем ответе о том, чтобы не делать этого таким образом…
5. @BoltClock: Я не думаю, что даже этот случай применим: среда выполнения не видит приведение.
Ответ №1:
Как упоминали другие, если вы имеете дело с подклассом, все должно быть в порядке, но, судя по вашему коду, я предполагаю, что вам, вероятно, было бы лучше использовать реализацию протокола, см. http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html для общего обзора.
Если это не подходит, то вы можете сначала посмотреть на вызов responsestoselector, чтобы посмотреть, сработает ли вызов. http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/respondsToSelector:
Но в целом, вы не должны приводить self к другому классу….
Ответ №2:
Приведение сообщает компилятору, что переменная представляет определенный тип, даже если она не объявлена как таковая. Это избавит от предупреждений компилятора, но не повлияет на скомпилированный результат. В этом случае объявляется, что экземпляр ClassB на самом деле является экземпляром ClassA, так что он может вызывать setSomeNumber:
, но это сработает только в том случае, если объект действительно реализует этот метод. Если объект не является членом ClassA или подкласса, и его класс не реализует метод, ваша программа завершит работу во время выполнения.
Ответ №3:
Является ли ClassB подклассом ClassA? Если это так, то приведение не должно быть необходимым.
Вы можете привести любой указатель к любому классу, который вы хотите отключить предупреждение о том, что он может не отвечать на селектор, но если он не отвечает на селектор во время выполнения, ваше приложение завершит работу при попытке вызвать этот метод, и класс не ответит.