铸造自我

时间:2011-05-06 00:20:01

标签: objective-c

以下演员自我做什么“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 个答案:

答案 0 :(得分:2)

正如其他人所提到的,如果你正在处理一个子类,你应该没问题,但是根据代码的外观,我猜你可能会更好地使用协议实现,请参阅http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html了解概述。 / p>

如果这不合适,那么您可能需要先查看调用respondsToSelector以查看该调用是否有效。 http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/respondsToSelector

但总的来说,你不应该把自己投射到另一个班级......

答案 1 :(得分:1)

一个演员告诉编译器该变量代表某种类型,即使它没有这样声明。它将摆脱编译器警告,但它不会影响编译输出。在这种情况下,它声明ClassB的实例实际上是ClassA的一个实例,因此它可以调用setSomeNumber:,但这只有在对象实际实现该方法时才有效。如果该对象不是ClassA或子类的成员,并且其类未实现该方法,则您的程序将在运行时崩溃。

答案 2 :(得分:0)

ClassB是ClassA的子类吗?如果是,则不需要演员。

您可以将任何指针强制转换为要禁用其可能不响应选择器的警告的类,但如果它在运行时没有响应选择器,则当您尝试调用该方法时,您的应用程序将崩溃而且班级没有回应。