强制是如何运作的?

时间:2012-07-24 16:59:55

标签: iphone ios coercion

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

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

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

然后我选择了MFMessageComposeViewController

并且它工作 - 令人惊讶 - 由于某种原因,类变量被正确转移。

这是如何运作的?运行时是否真的搜索类变量NAMES以找到适当的类变量?

我认为强制只会是记忆的重叠。

非常感谢您的见解?

1 个答案:

答案 0 :(得分:3)

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

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

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

所有这一切,你应该删除这个类并用适当的子类替换它,此时你(可能)不必担心类型转换。