2012-03-09 77 views
0

我有一个NSMutableArray,它返回一些对象。 我添加的对象有属性名称,年龄。为什么调用NSObject指针的属性会产生构建错误?

现在,当我使用返回的对象(obj.nameobj.age)这些特性, 编译器说,没有这样的成员,使用(->),而不是(.

据我所知,NSObject的不会有这些成员和因此它不会理解这个属性。

但是,如果我使用setters和getters作为方法([obj name][obj age])语法而不是此属性,我没有得到任何错误。

但使用属性意味着只调用setter或getter?
广告Objective C假设是动态语言,对吧?

回答

1

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

你需要一个指针转换为实际的类:

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

你将返回的对象到对象类型(MyObject)?

你应该这样做:在使用[[mutableArray objectAtIndex:0] name]语法是你调用返回的对象的方法(这是id型)

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

的原因你没有得到任何错误,和id如果你对它们调用(但是)不存在的方法,它们在编译期间往往不会窒息。在运行时,[mutableArray objectAtIndex:0]可能决定键入MyObject,在这种情况下,消息[obj name]具有适当的实现(IMP)。如果它不解析为MyObject,您的应用程序将崩溃。

而且请注意,你甚至没有得到一个编译时警告的原因是,Xcode中知道,有一个在您的代码库实现该方法name至少1类,并将其信任你与调用此方法仅该类的实例。如果你做了类似((MyObject*)[mutableArray objectAtIndex:0]).ageeeeee = 20;的东西,它会给你一个警告,因为它很有可能会崩溃(你的应用中没有任何类实现方法ageeeeee静态)。

类型id没有属性name,这就是为什么你不能使用点语法。

事实上,这个事件显示了为什么ObjC被称为动态语言!

+0

这很好。但点语法假设代表对setter或getter方法的调用。所以它不应该以一种方法调用它的方式来调用它是否存在? 反正..谢谢澄清:) – 2012-03-09 05:50:46

+0

如果该财产应该只是只读?除非编译器确切地知道你正在谈论哪个类/属性,否则它不知道你是否应该被允许使用它(至少在你想设置值的情况下)。 – UIAdam 2012-03-09 05:55:14

+0

@UIAdam:不错的一点,但如果属性是只读的,那么setter不会被生成,并且我应该在运行时得到一个“无法识别的选择器发送到对象异常”。 – 2012-03-09 06:00:55

相关问题