Iphone 强制是如何工作的?

Iphone 强制是如何工作的?,iphone,ios,coercion,Iphone,Ios,Coercion,我刚刚创建了一个普通的MyClass并定义了一个实例变量 @interface MyMFMessageComposeViewController : NSObject { NSString *body; NSArray * recipients; } @property (readwrite, strong) NSString *body; @property (readwrite, strong) NSArray * recipients; @end 然后我转到MFMe

我刚刚创建了一个普通的MyClass并定义了一个实例变量

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

@property (readwrite, strong) NSString *body;
@property (readwrite, strong) NSArray * recipients; 
@end
然后我转到
MFMessageComposeViewController

令人惊讶的是,由于某种原因,类变量被正确地转移了

这是如何工作的?运行时真的会搜索类变量名以找到合适的类变量吗?

我以为强迫只是记忆的覆盖


非常感谢您的见解?

Objective-C是弱类型的(有些人甚至说它是非类型的),这意味着对象的确切类型并不重要,只要它响应程序尝试发送的所有选择器(方法名称)

MyMFMessageComposeViewController和MFMessageComposeViewController都有名为
body
setBody
recipients
setRecipients
的方法,因为这两个类都声明和合成了名为body和recipients的属性。(请记住,合成属性只会创建这些访问器方法。)如果从外部对象访问成员变量,则使用这些方法,即使使用点表示法也可以

简而言之,您没有直接访问实例变量;相反,您使用的是访问器方法,并且由于Objective-C在调用方法时不关心对象的类型,所以一切正常


尽管如此,您应该删除这个类并用一个合适的子类替换它,这样您(可能)就不必担心类型转换了。

您所说的“强制”是什么意思?铸造你喝得醉醺醺的吗?您还没有显示足够的代码来找出哪些代码能够“工作”。非常感谢您的清晰解释!顺便说一下,我不能将MFMessageComposeViewController子类化的原因是,在模拟器中,它在尝试创建新实例时总是返回nil。-但是有了你的解释,我感觉很好-因为我只是在开发过程中使用这个类,所以我不需要发送真正的SMSs.ps-只是为了说明-所以强制也使用这些setter和getter?因此,必须有一个循环,通过右侧对象的所有属性获取它们的值,并在赋值中使用左侧对象的相应设置器:MFMessageComposeViewController*realObj=(MFMessageComposeViewController)myObj;除非
myObj
真的是一个
MFMessageComposeViewController*
(注意星号),否则这个赋值没有多大意义。在这种情况下,您只是将指针
myObj
复制到指针
realObj
——您没有创建其他对象。@user387184-类型无关紧要。您可以将一个对象声明为
id whatIsThis
,只要指定给whatIsThis的指针是实现该方法的类的实例(无论是getter、setter还是任何其他方法),它都可以工作。(如果您曾经在操作方法中调用过
[sender frame]
,您已经证明了这一点。)如果该类没有实现该方法,您的应用程序将崩溃。如果您想更多地了解实现这一点的“魔力”,请查阅objc_msgSend()。