iOS - 如何正确访问数组中的对象属性?

时间:2012-08-15 12:52:53

标签: iphone ios properties nsarray ivar

设定:

ViewController拥有MyArray中的PersonClass个对象。 PersonClass只有两个属性:nameage

问题:

当我想从name中的第一个对象中读出MyArray属性时,是否有正确的方法来执行此操作?

我是否必须暂时创建PersonClass这样的实例?

PersonClass *tmp = [PersonClass alloc] init];
tmp = [MyArray objectAtIndex:0];

NSLog(@"%@", tmp.name);

或者我可以直接推荐propertiesobjects的{​​{1}}吗?

这样的事情:

MyArray

5 个答案:

答案 0 :(得分:6)

我强烈建议使用

[(PersonClass *)[MyArray objectAtIndex:0] name]

而不是看似更清洁,但更麻烦的形式

[[MyArray objectAtIndex:0] name]

这有两个原因。首先,对于读者来说,明确指出哪个对象被调用。其次,对于编译器来说它是显式的 - 如果两个方法共享相同的名称,但不同的返回值可能会令人讨厌。 Cocoa With Love的Matt Gallagher有excellent explanation of this issue.

答案 1 :(得分:0)

你可以这样做

PersonClass *tmp = (PersonClass *) [MyArray objectAtIndex:0];
NSLog(@"%@",tmp.name);

或者我们可以将它放在一行:

NSLog(@"%@",((PersonClass *)[MyArray objectatIndex:0]).name);

NSLog(@"%@", [self.contactsArray objectAtIndex:0].name);不起作用的原因是您没有告诉编译器[self.contactsArray objectAtIndex:0]处的对象类型是什么。因为它不知道数组中的对象类型,所以它无法知道它具有name属性

答案 2 :(得分:0)

((PersonClass *)[MyArray objectAtIndex:0]).name

或仅[[MyArray objectAtIndex:0] name]

答案 3 :(得分:0)

  

我是否必须像这样暂时创建一个PersonClass实例?

PersonClass *tmp = [PersonClass alloc] init];
tmp = [MyArray objectAtIndex:0];

NSLog(@"%@", tmp.name);

没有。只需使用

PersonClass *tmp = (PersonClass *)[myArray objectAtIndex:0];
NSLog(@"%@", tmp.name);

由于你从myArray获取的对象是(或应该是!)已经被添加到数组之前已经被分配并初始化了。数组中的东西是指向对象的指针。这就是你要传递的东西。你必须告诉它你在那里有哪种类型的对象(演员是(PersonClass *)),因为NSArray只存储NSObjects。

你也可以在一行中这样做

((PersonClass *)[myArray objectAtIndex:0]).name;

答案 4 :(得分:0)

如果你想要或需要这种类型,那么引入类似的类型:

PersonClass * person = [array objectAtIndex:0];

我经常为可读性做这件事,因为包含文件的声明可能会破坏事情。

请注意,从id值分配objc变量时,不需要强制转换

  

我是否必须临时创建PersonClass的实例?

没有。你编写的程序创建了一个永远不会使用的临时程序。