2012-07-24 51 views
1

我剛創建一個正常MyClass的和定義的變量的實例強制是如何工作的?

@interface MyMFMessageComposeViewController : NSObject 
{ 
    NSString *body; 
    NSArray * recipients; 
} 

@property (readwrite, strong) NSString *body; 
@property (readwrite, strong) NSArray * recipients; 
@end 

然後我coreced到MFMessageComposeViewController

它的工作 - 出人意料 - 出於某種原因,類變量得到了正確的轉移。

這是如何工作的?運行時是否真的搜索類變量NAMES以查找適當的類變量?

我以爲強制只是記憶的重疊。

非常感謝您的洞察力?

+1

你是什麼意思的「脅迫」?鑄件? ISA-混寫?你還沒有顯示足夠的代碼來找出什麼設法「工作」。 – 2012-07-24 17:05:35

回答

3

Objective-C是弱類型的(有些人甚至認爲它是無類型的),這意味着對象的確切類型並不重要,只要它響應所有選擇器(方法名稱),程序就會嘗試發送它。

MyMFMessageComposeViewController和MFMessageComposeViewController都有方法稱爲bodysetBodyrecipientssetRecipients因爲這兩類聲明和合成命名的身體和收件人屬性。 (請記住,合成屬性只是創建這些訪問器方法。)如果從外部對象訪問成員變量,則即使使用點符號來執行這些方法,也可以使用這些方法

總之,你不直接訪問實例變量;相反,您使用的是訪問器方法,並且由於Objective-C在調用方法時並不關心對象的類型,所以它都可以正常工作。

所有的說法,你應該刪除這個類,並用適當的子類替換它,在這一點上,你(可能)不會擔心類型轉換。

+0

非常感謝您的明確解釋!順便說一下,我無法繼承MFMessageComposeViewController的原因是因爲在模擬器中嘗試創建新實例時它總是返回nil。 - 但是你的解釋讓我感覺很好 - 因爲我在開發過程中只是使用這個類,所以我不需要發送真正的短信。 – user387184 2012-07-24 17:55:37

+0

ps - 只是爲了表明 - 強制以及使用這些制定者和獲得者?因此,必須通過右側對象的所有屬性循環獲取它們的值,並在賦值中使用左側對象的對應設置器:MFMessageComposeViewController * realObj =(MFMessageComposeViewController)myObj; – user387184 2012-07-24 18:04:00

+0

除非'myObj'確實是一個'MFMessageComposeViewController *'(注意星號),那麼這個賦值就沒有多大意義。在這種情況下,您只需將指針「myObj」複製到指針「realObj」 - 您不會創建不同的對象。 – Caleb 2012-07-24 18:32:38

相關問題