现在和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对象数组。 然后如何访问数组以读取和写入它。
提前感谢您阅读我的帖子。
答案 0 :(得分:51)
使用Cocoa / CocoaTouch的Objective-C中的数组与Java完全不同。三个主要区别是:
Obj-C数组只是与其他类似的类,并且在语言中没有内置支持。在Java中,数组通过[]
运算符在语言中具有内置支持。
Obj-C数组是无类型的,它们接受任何继承自NSObject
的对象。这意味着您可以在同一个数组中混合类型,但这可能是不好的做法,除非您有充分的理由。 (请注意,int
,double
,char
,BOOL
和其他内置类型不会从NSObject
继承,因此您必须将它们包装起来在NSNumber
对象中,如果您想将它们保存在数组中。)
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:
。要在数组中间插入一个对象(并记住,这也会增加数组的大小),请调用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