2011-05-06 104 views
2

以下鑄造自我做「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]; 
} 
+0

哇,這真是離奇。 – BoltClock 2011-05-06 00:23:02

+0

是ClassB ClassA的一個子類? – 2011-05-06 00:23:27

+1

@Cory Powers:除非'someNumber'被遮蔽,否則即使不需要演員陣容。如果這個屬性被隱藏,這是一個全新的問題...... – BoltClock 2011-05-06 00:23:53

回答

2

正如其他人所說,如果你正在處理一個子類,你應該沒問題,但通過你的代碼的外觀我猜你可能會更好與協議實現見http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.html概述。

如果這不合適,那麼您可能需要先查看調用respondsToSelector以查看該調用是否可用。 http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/respondsToSelector

但總體來說,你不應該鑄造自己到另一個類....

1

的鑄造告訴該變量表示特定類型的,儘管它未聲明爲這樣的編譯器。它將擺脫編譯器警告,但它不會影響編譯的輸出。在這種情況下,它聲明ClassB的實例實際上是ClassA的一個實例,因此它可以調用setSomeNumber:,但這隻有在對象實際實現該方法時纔有效。如果對象不是ClassA或子類的成員,並且其類沒有實現該方法,那麼程序將在運行時崩潰。

0

ClassB是ClassA的子類嗎?如果是這樣,則不需要投射。

您可以將任何指針強制轉換爲您希望禁用的一個警告,即它可能不會響應選擇器,但如果它在運行時沒有響應選擇器,您的應用程序會在嘗試調用該選擇器時崩潰方法和類不響應。