1

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

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

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

然后我核心到MFMessageComposeViewController.

它起作用了——令人惊讶的是——由于某种原因,类变量被正确地转移了。

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

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

非常感谢您的洞察力?

4

1 回答 1

3

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

MyMFMessageComposeViewController 和 MFMessageComposeViewController 都有名为body, setBody,的方法recipientssetRecipients因为这两个类都声明并合成了名为 body 和 recipients 的属性。(请记住,合成属性只会创建这些访问器方法。)如果您从外部对象访问成员变量,那么您就是在使用这些方法,即使您使用点符号来执行它

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

话虽如此,您应该删除此类并将其替换为适当的子类,此时您(可能)不必担心类型转换。

于 2012-07-24T17:14:08.310 回答