为什么在NSObject指针上调用属性会产生构建错误?

时间:2012-03-09 05:23:59

标签: objective-c

我有一个NSMutableArray,它会返回一些对象。 我添加的对象具有属性名称,年龄。

现在当我在返回的对象(obj.nameobj.age)上使用这些属性时, 编译器说,没有这样的成员,使用(->)代替(.

我知道NSObject不会拥有这些成员,因此它不会理解该属性。

但是如果我使用setter和getters作为方法([obj name][obj age])语法而不是这个属性,我就不会有任何错误。

但是使用属性意味着只调用一个setter或getter? 广告目标C是动态语言,对吧?

2 个答案:

答案 0 :(得分:3)

您是否将返回的对象强制转换为对象类型(MyObject)?

您应该执行以下操作:

((MyObject*)[mutableArray objectAtIndex:0]).age = 20;

使用[[mutableArray objectAtIndex:0] name]语法时没有收到任何错误的原因是您在返回的对象(类型为id)和id上调用方法如果你对它们调用一个(但是)不存在的方法,那么在编译时它往往不会窒息。在运行时,[mutableArray objectAtIndex:0] 可能解析为在此情况下键入MyObject,消息[obj name]具有正确的实现(IMP) 。如果它没有解析为MyObject,您的应用就会崩溃。

请注意,您甚至没有收到编译时警告的原因是Xcode知道您的代码库中至少有一个类实现了方法name,并且它信任您调用此方法方法在该类的实例上。如果您执行((MyObject*)[mutableArray objectAtIndex:0]).ageeeeee = 20;之类的操作,它会给您一个警告,因为它很可能会崩溃(您的应用中没有类实现方法ageeeeee 静态)。

类型id没有属性name,这就是您无法使用点语法的原因。

实际上,这一事件完全证明了为什么ObjC被称为动态语言!

答案 1 :(得分:1)

没错 - 在这种情况下不支持点语法。

您需要投射指向实际类的指针:

((MyObject*)[array objectAtIndex: 0]).name = @"Bill";