тип кастинг сам - PullRequest
       4

тип кастинг сам

2 голосов
/ 06 мая 2011

Что делает следующий кастинг себя "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];
}

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

Как уже упоминали другие, если вы имеете дело с подклассом, у вас все должно быть в порядке, но, судя по виду вашего кода, я полагаю, вам лучше было бы реализовать реализацию протокола, см. http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html для обзора.

Если это не совсем подходит, то вы можете сначала посмотреть на вызов responsedsToSelector, чтобы увидеть, будет ли этот вызов работать. http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/respondsToSelector:

Но в целом вы не должны бросать себя в другой класс ....

1 голос
/ 06 мая 2011

Приведение говорит компилятору, что переменная представляет определенный тип, даже если она не объявлена ​​как таковая. Это избавит от предупреждений компилятора, но это не повлияет на скомпилированный вывод. В этом случае объявляется, что экземпляр ClassB на самом деле является экземпляром ClassA, поэтому он может вызывать setSomeNumber:, но это будет работать только в том случае, если объект действительно реализует этот метод. Если объект не является членом ClassA или подкласса, и его класс не реализует метод, ваша программа будет аварийно завершена во время выполнения.

0 голосов
/ 06 мая 2011

Является ли ClassB подклассом ClassA?Если это так, никакое приведение не должно быть необходимым.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...