Objective c 获取通过id变量分配的类实例属性

Objective c 获取通过id变量分配的类实例属性,objective-c,Objective C,我正在学习Objective-C。如果我理解正确,请使用以下代码: id data; myClass = [[NSObject alloc]init]; data = myClass; 将myClass实例分配给data,因此,我可以像使用myClass一样使用data 以下代码工作正常: data = myClass; [data methodBelongToMyClass]; 但我无法访问该类的属性。请看一看(分子是myClass的属性): 由于在类型为“\u strond id”的对象

我正在学习Objective-C。如果我理解正确,请使用以下代码:

id data;
myClass = [[NSObject alloc]init];
data = myClass;
myClass
实例分配给
data
,因此,我可以像使用
myClass
一样使用
data

以下代码工作正常:

data = myClass;
[data methodBelongToMyClass];
但我无法访问该类的属性。请看一看(分子是myClass的属性):

由于在类型为“\u strond id”的对象上找不到属性分母的错误,它崩溃(实际上甚至没有运行)

是的,我理解它的自解释性,但是,我已经为id对象分配了类实例,所以为什么我不能访问属性


任何帮助和解释都将不胜感激,谢谢

这是因为
data
id
类型而不是
NSObject
。 编译器不知道
id data
中的数据类型,因此无法引用它

如果您创建一个铸件,即

id data = MyCalss;
NSObject *object = (NSObject *)data;

你可以访问课堂上的内部数据。

我对你的问题有点困惑,但我会尽力回答

因为id被认为是“任意”的,所以它不知道属性,除非您将其强制转换为您将其设置为的对象类型。但是你可以这样做

[data valueForKey@"propertyName"]
使用id可能非常强大,但也可能被滥用,并在尝试调试时给您带来很多麻烦


希望能有帮助。

是的。但我建议编译器理解并将所有的值和属性分配给新的id对象。遗憾的是,id不是这样工作的。Id是一个“任意”对象,不知道它继承的属性和方法。在大多数情况下,您不会像示例中那样使用id。以我的经验,我看不出开发人员经常使用id。像NSArray和NSDictionary这样的东西会拿走和id,但当你把它拿出来的时候,你总是把它当作某种东西扔掉。例如MyClass*MyClass=myArray[0];这样编译器就知道您要做什么。我希望这有点帮助。谢谢它的帮助,但是您的代码产生了一个错误-二进制表达式('int'和'id')的操作数无效-[dataValue valueForKey:@“分子”];否则我如何检索该值?事实上,我只是想知道“事物是如何工作的”,这与实际使用无关:)你会想从它的发音中把它转换成它想要的数据类型(int)[data valueForKey@“denominator”]。但为什么编译器知道方法呢?变量也在.h文件中声明,就像类实例方法一样。我可能弄错了,但我认为编译器不知道该id上的方法。它知道有一个方法可能因为导入而被调用。id允许您向它传递“消息”,希望它做出相应的响应。然而,这是使用id的一些挑战。如果该方法实际上不在该id上,并且编译器不知道wiser.id是一种将数据作为“通用”数据类型传递的方法,那么您的应用程序可能会崩溃。您可以使用id指向任何类型的数据。但id不知道现有类的任何现有方法。可能编译器不知道方法,但它会自动填充名称,不会产生错误,我猜它会在运行时查找方法描述。但为什么不考虑房地产呢?它们是相同的方法、setter和getter..实际上您可以执行[myClass denominator],因为调用getter是相同的。你可能也想看看这个
[data valueForKey@"propertyName"]