2012-07-06 75 views
-2

我有一个对象是这样的:如何处理对象到一个NSMutableArray

@interface object : NSObject 
{  
    NSString *_observation;  
    NSInteger _id;  
    NSString *_date; 
    NSString *_device; 
    double _latitude; 
    double _longitude; 
} 

所以当你看到它有一些属性。然后,我创建一个NSMutableArray是充满像上面的物体,如

array[object, object ,object, ....] 

我想问的是我如何处理特定对象的特定属性到数组? 例如,如何处理第一个对象id属性到obj-c中的数组?

非常感谢!

+0

你是什么意思“处理属性到数组”?你想插入一个属性到数组中吗?或者检索数组中的对象的属性?顺便说一句,你需要在这些变量周围创建一些属性,否则你将无法从'object'类外部访问它们。 – 2012-07-06 15:08:09

+0

检索数组对象的属性。当然,我已经创建了属性,这只是一个伪代码示例 – user1507121 2012-07-06 15:10:06

+1

要理解你所问的是什么非常困难,你能提供一个你想要做的事情类型的例子吗? – 2012-07-06 15:13:36

回答

0

为了访问数组中对象的成员,您需要获取指向该对象的指针。即:

object *firstObject = [array objectAtIndex:0]; 
firstObject.id = 0; 
object *secondObject = [array objectAtIndex:1; 
... 
3

如果我理解正确的问题,你想一旦它被置于一个NSMutableArray内访问对象的实例变量。

如果问题是那么容易,这是您的解决方案:

NSInteger *currID = [array objectAtIndex:x].id; 

此外,还可以使用快速列举要经过整个数组访问每个元素的变量。

NSInteger *currID; 
for (NSObject *currentObject in array) { 
    currID = currentObject.id; 
    //proccess ID 
} 

这里假设你已经在.h文件设置为@propertyid如此:

@property (nonatomic) BOOL latitude; 
@property (nonatomic) BOOL longitude; 
@property (nonatomic, copy) NSString *observation;  
@property (nonatomic) NSInteger id;  
@property (nonatomic, copy) NSString *date; 
@property (nonatomic, copy) NSString *device; 

过程中的.m和:

@synthesize latitude; 
@synthesize longitude; 
@synthesize observation; 
@synthesize id; 
@synthesize date; 
@synthesize device; 
+0

如果未声明属性,则不能使用'.'来访问'_id'。 – 2012-07-06 16:28:42

+0

实例变量在默认情况下受到保护,因此您不能这样做。请修改您的答案。 – 2012-07-06 16:37:50

+0

@Flex_Addicted公平评估。 – 2012-07-06 17:42:37

0

要么

[[array objectAtIndex:0] id] 

[array objectAtIndex:0].id 

假设围绕_id数据成员属性被称为id。这是一个属性getter调用,而不是直接的ivar访问。

NSArray没有,也不能用它们的[i]索引表示法来模拟C数组。这不是C++,可以重新定义[]运算符。在上面的行中,括号表示ObjC方法调用(AKA“消息传递”),而不是数组索引。

0

NSArray文档是你的朋友。

无论如何,要访问对象数组,您可以使用- (id)objectAtIndex:(NSUInteger)index方法NSArray

什么塞瓦阿列克谢耶夫是说你的班级必须以不同的方式组织。例如:

//.h 
@interface MyCustomObject : NSObject 
{ 
    // you dont need to declare variables, the compiler will do it for you 
} 

@property (nonatomic, copy) NSString* objObservation; 
@property (nonatomic, assign) NSInteger objId; 
@property (nonatomic, copy) NSString* objDate; 
@property (nonatomic, copy) NSString* objDevice; 
@property (nonatomic, assign) double objLatitude; 
@property (nonatomic, assign) double objLongitude; 

@end 

//.m 
@implementation MyCustomObject 

@synthesize objId; 
@synthesize objDate; 
@synthesize objDevice; 
@synthesize objLatitude; 
@synthesize objLongitude; 
@synthesize objObservation; 

- (void)dealloc 
{ 
    /* uncomment if you don't use ARC 
    [objDate release]; 
    [objDevice release]; 
    [objObservation release]; 

    [super dealloc]; 
    */ 
} 

@end 

使用你的类像这样(你需要#import "MyCustomObject.h"

// populate your object 
MyCustomObject* myObj = [[MyCustomObject alloc] init]; 
myObj.objDate = @"yourDate"; 
myObj.objDevice = @"yourDevice"; 
myObj.objId = 1; 
myObj.objLatitude = 22.0; 
myObj.objLongitude = 23.87; 
myObj.objObservation = @"yourObservation"; 

// insert it into your array (here only for test purposes but you could create an instance variable for store it) 
NSArray* myArray = [NSArray arrayWithObjects:myObj, nil]; 

// if you don't use ARC 
[myObj release]; 

// grab the object from the array 
MyCustomObject * currentObj = [myArray objectAtIndex:0]; 
// see its values, for example 
NSLog(@"%@", [currentObj objDevice]); 

现在我想补充一些注释。

  • 当你使用class时,用大写字母(例如, MyClass而不是myclass,则变量以小写开始,例如, myVariable
  • 如果你的阵列可以在不同的时间填充,你需要一个NSMutableArray。 A NSArray一经创建就无法更改。 NSMutableArray反而是动态的,你可以添加或删除对象
  • 当你处理对象时,你应该用属性包装你的变量(在这种情况下,你不需要变量,因为编译器会为它们提供@synthesize指令)。这样,您就不能打破的对象封装
  • 你能想到的,如果你想

当你写问题,尽量把一些背景绕过它,试图解释你做了什么,以提供一个初始化到对象和你想实现什么。

+0

在这种情况下,你不想使用'strong'或'retain'而不是'copy'。这只是额外的开销,因为它们无论如何都不可变。 – 2012-07-06 17:57:42

+0

@MichaelBoselowitz http://stackoverflow.com/questions/9700755/copy-or-retain-nsstring-parameter – 2012-07-06 18:07:12

+1

即使回答问题,你也可以学到一些东西;)。 – 2012-07-06 18:22:15

相关问题