【问题标题】:Making an array of Objects in Objective-C.在 Objective-C 中创建一个对象数组。
【发布时间】:2011-04-08 11:43:42
【问题描述】:

现在已经使用 XCode 大约 2 周了,并且阅读了一些关于 MVC 的信息。我在尝试将模型连接到控制器时遇到问题,因为我发现很难理解数组。当我用 Java 编写一些简单的数组时,我可以处理简单的数组,但我对 Obj-C NSArrays 看到的感到害怕。

如果有人愿意向我展示一些对对象数组的简单调用,我将永远感激不尽。

我的模特:

人.h

#import <Foundation/Foundation.h>

@interface Person : NSObject 
{
NSString *name;
NSNumber *age;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSNumber *age;

@end

人.m

#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
@end

在我尝试学习的过程中,我一直保持非常简单。

现在我的控制器类。我想做的是创建一个包含 40 个“人”对象的数组。但我不知道将其放入 Obj C 代码中的正确方法。

控制器.h

#import <Foundation/Foundation.h>
@class Person;
@interface Controller : NSObject 
{
Person *person;
}
@property(nonatomic, retain) Person *person;

-(void) doSomeWork;

@end

控制器.m

#import "Controller.h"
#import "Person.h"

@implementation Controller

@synthesize person;


-(IBAction)doSomeWork
{
// I guess here is where i should create my array of 40 person objects
}

@end

我的问题是如何声明大小为 40 的人员对象数组。 然后是如何访问数组进行读写。

提前感谢您阅读我的帖子。

【问题讨论】:

  • 不要被吓倒。一个 Objective-C 数组就像一个 Java ArrayList&lt;Object&gt;。它可以像 ArrayList 一样增长和收缩,并且可以容纳任何对象(您可以在数组中混合对象类型)。
  • 它不是一个数组列表。它不能增长/缩小——只有可变数组可以

标签: iphone objective-c model-view-controller nsarray


【解决方案1】:

Objective-C 中带有 Cocoa/CocoaTouch 的数组与 Java 完全不同。三个主要区别是:

  1. Obj-C 数组和其他数组一样只是类,在语言中没有内置支持。在 Java 中,数组通过[] 运算符在语言中具有内置支持。

  2. Obj-C 数组是无类型的,它们采用继承自 NSObject 的任何对象。这意味着您可以在同一个数组中混合类型,尽管这可能是一种不好的做法,除非您有充分的理由。 (请注意,intdoublecharBOOL 和其他内置类型不会从 NSObject 继承,因此如果您愿意,您必须将它们包装在 NSNumber 对象中将它们保存在一个数组中。)

  3. Obj-C 数组实际上并没有固定长度的概念,除非整个数组是不可变的。所以你在创建数组时不需要决定长度。

要创建一个可变数组,即允许您更改对象(甚至添加和删除对象,更改数组长度)的数组,您可以创建一个NSMutableArray

myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.

要添加一个对象,例如Person 的实例,您可以调用addObject: 方法,或者在此处创建一个新的Person,或者给它一个指向现有对象的指针:

[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.

要删除对象,您可以使用removeObjectAtIndex:removeLastObject。要更换,请致电replaceObjectAtIndex:withObject:。要在数组中间插入一个对象(请记住,这也会增加数组的大小),请调用 insertObject:atIndex:

这涵盖了最重要的 mutating 方法,即那些特定于 NSMutableArray 的方法。当然,您也有只观察数组的方法,这些方法在NSArray 中定义。最重要的是count,给出当前元素的数量,objectAtIndex:,给出你提供的索引处的对象。

假设您的数组中有一些 Person 对象,您可以像这样遍历它们:

for (int i = 0; i < [myArray count]; i++) {
    Person* p = [myArray objectAtIndex: i];
    // Do something with p 
}

您可能想知道如果不允许添加 NSArray,您将如何创建它。好吧,它的构造函数之一是initWithObjects:,它允许您编写一个逗号分隔的要添加对象列表(并且您需要以nil 值结尾)。另一个是initWithArray:,它允许您传递另一个数组(可能是可变的),并且构造函数在创建新数组时将使用提供的数组中的对象。

【讨论】:

  • :) 我想我现在开始明白了!因此,在上面的最后一个代码片段中,您可以从数组中取出一个人的实例并将其存储在“p”中。因此,我可以通过执行类似 int personAge = p.age; 之类的操作来检查该对象的数据;或者如果我想更新该对象,我可以更改 p.age = 24;然后使用 replaceObjectAtIndex:p:index 将 p 写回该索引中的数组
  • @Code:正确,除了最后一点。如果您执行了p.age = 24,那么这将立即反映在存储在数组中的Person 对象中。您在这里了解编程语言语义的核心部分:当您调用 objectAtIndex: 时,您会获得一个指向已经存在的 Person指针,您不会获得 @987654353 的副本@ 你可以改变然后放回去。
  • 啊!这太酷了。有点疯狂,我不知道-.-
  • 应该指出的是,在 Xcode 的更高版本中,除了先前定义的方法调用之外,还支持用于索引 NSArrays [] 表示法
  • lincb,您在伤害帖子中添加了语法错误。您所做的更改导致最左边的方括号有一个不匹配的右方括号。用户需要减少编辑权限。
【解决方案2】:

这是一个示例,它在 Controller 类中创建一个 NSMutableArray 实例变量,并在每次调用 doSomeWork 时向该数组添加一个 Person 对象:

@interface Controller

NSMutableArray *personArray;

@end
@implementation Controller

- (void) viewDidLoad {
    ................
    NSMutableArray *personsArray = [[NSMutableArray alloc] initWithCapacity:40];
}

- (IBAction)doSomeWork {
    Person *myPerson = [[Person alloc] init];
    myPerson.name = name;
    myPerson.age = age;

    [personsArray addObject:myPerson];
}
@end

【讨论】:

  • 太棒了!现在我如何访问personsArray 的每个元素的nameage
  • @JohnK for(Person *person in personsArray) { NSLog(@"Persons age: %@", person.age); NSLog(@"人名:%@", person.name); }
  • ?Autorelease 在这条线上?否则你正在咀嚼记忆。 Person *myPerson = [[[Person alloc] init] autorelease];
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2013-05-17
相关资源
最近更新 更多