在Objective-C中创建一个对象数组。

时间:2010-09-05 16:25:13

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

现在和XCode一起玩了大约2个星期,并且稍微阅读了MVC。我试图将模型连接到控制器时遇到问题,因为我发现很难理解数组。当我用Java编程时,我可以处理简单数组但是我很安静地被Obj-C NSArrays所吓倒。

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

我的模特:

Person.h

#import <Foundation/Foundation.h>

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

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

@end

Person.m

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

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

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

或者Controller.h

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

-(void) doSomeWork;

@end

Controller.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的person对象数组。 然后如何访问数组以读取和写入它。

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

2 个答案:

答案 0 :(得分:51)

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

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

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

  3. Obj-C数组实际上没有固定长度的概念,除非整个数组是不可变的。因此,在创建阵列时无需确定长度。

  4. 要创建一个可变数组,即允许更改对象的数组(甚至添加和删除对象,更改数组的长度),您可以创建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:

    要删除对象,您可以使用removeLastObjectreplaceObjectAtIndex:withObject:。要替换,请致电insertObject:atIndex:。要在数组中间插入一个对象(并记住,这也会增加数组的大小),请调用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:,它允许你编写一个以逗号分隔的对象列表来添加(你需要以{{1}}值结束)。另一个是{{1}},它允许你传递另一个数组(可能是可变的),构造函数在创建新数组时将使用提供的数组中的对象。

答案 1 :(得分:29)

这是一个在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