我有一个NSMutableArray
,它会返回一些对象。
我添加的对象具有属性名称,年龄。
现在当我在返回的对象(obj.name
或obj.age
)上使用这些属性时,
编译器说,没有这样的成员,使用(->
)代替(.
)
我知道NSObject不会拥有这些成员,因此它不会理解该属性。
但是如果我使用setter和getters作为方法([obj name]
或[obj age]
)语法而不是这个属性,我就不会有任何错误。
但是使用属性意味着只调用一个setter或getter? 广告目标C是动态语言,对吧?
答案 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";