1

设置:

ViewController持有一个MyArray来自 的对象PersonClassPersonClass只有两个属性:nameage

问题:

当我想name从第一个对象中读出一个属性时,MyArray这样做的正确方法是什么?

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

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

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

或者我可以直接参考propertiesobjectsMyArray吗?

像这样的东西:

 NSLog(@"%@", [self.contactsArray objectAtIndex:0].name); // not working
4

5 回答 5

6

我强烈建议使用

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

而不是看似干净,但麻烦的形式

[[MyArray objectAtIndex:0] name]

有两个原因。首先,对于读者来说,在哪个对象上调用了什么是明确的。其次,它对编译器来说是明确的——如果两个方法共享相同的名称,但返回值不同,事情就会变得很糟糕。Cocoa With Love 的 Matt Gallagher对这个问题有很好的解释。

于 2012-08-15T13:08:08.727 回答
0

如果您希望或需要该类型,请像这样引入该类型:

PersonClass * person = [array objectAtIndex:0];

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

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

我必须临时创建一个 PersonClass 的实例吗?

不。您编写的程序会创建一个从未使用过的临时文件。

于 2012-08-15T13:01:45.347 回答
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属性

于 2012-08-15T12:55:33.090 回答
0
((PersonClass *)[MyArray objectAtIndex:0]).name

要不就[[MyArray objectAtIndex:0] name]

于 2012-08-15T12:56:22.090 回答
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;

于 2012-08-15T12:57:33.793 回答