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

20 iphone model-view-controller objective-c nsarray

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

如果有人能够如此友善地向我展示一些对象的简单调用,那么我将永远感激不尽.

我的模特:

Person.h

#import <Foundation/Foundation.h>

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

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

@end
Run Code Online (Sandbox Code Playgroud)

Person.m

#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
@end
Run Code Online (Sandbox Code Playgroud)

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

现在我的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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我的问题是如何声明大小为40的person对象数组.然后如何访问数组以读取和写入它.

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

har*_*rms 51

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

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

  2. Obj-C数组是无类型的,它们接受任何继承的对象NSObject.这意味着您可以在同一个数组中混合类型,但这可能是不好的做法,除非您有充分的理由.(需要注意的是int,double,char,BOOL和其他内置类型不继承NSObject,所以你必须来包装他们NSNumber的对象,如果你曾经想阻止他们在数组中.)

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

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

myArray = [[NSMutableArray alloc] init];
// Could also use initWithCapacity: 40, but not necessary.
Run Code Online (Sandbox Code Playgroud)

要添加一个对象,例如你的实例,你Person可以调用该addObject:方法,在Person那里创建一个新的权限,或者给它一个指向现有的指针:

[myArray addObject: [[[Person alloc] init] autorelease]];
[myArray addObject: someOtherPerson];
// Last line adds some other person I already had a pointer to.
Run Code Online (Sandbox Code Playgroud)

要删除对象,可以使用removeObjectAtIndex:removeLastObject.要替换,你打电话replaceObjectAtIndex: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 
}
Run Code Online (Sandbox Code Playgroud)

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


enn*_*ler 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
Run Code Online (Sandbox Code Playgroud)

  • @JohnK for(Person*person in personsArray){NSLog(@"Persons age:%@",person.age); NSLog(@"人名:%@",person.name); } (2认同)