如何使用更少的代码编写实现`NSMutableArray`的`int array`?

时间:2014-07-17 20:28:44

标签: ios objective-c arrays

我正在尝试学习使用NSMutableArray实现int数组的最佳实践。乍一看,似乎需要编写更多的代码来管理它们相对于其他语言,如C或JAVA。

我呼吁用户体验有两个原因:(i)了解ios风格的int数组的代码编写实践; (ii)找到理由为什么尽管编码繁重,但这些数组在日常实践中与int array[7]证明了自己的合理性;

下面是一组示例模板,说明如何以非常通用的方式初始化,分配,读取和写入实现整数一维数组的NSMutableArray。

int arrayIndex;
int arrayValue;

//DECLARE arrayOfInt
@property (atomic, strong)  NSMutableArray *arrayOfInt;

//ALLOCATE AND INITIALIZE arrayOfInt
self.arrayOfInt = [[NSMutableArray alloc] init];

//...fill arrayOfInt (write)  
[self.arrayOfInt addObject: [NSNumber  numberWithInt: arrayValue]];

//... read arrayOfInt
arrayValue = [(NSNumber*)[self.arrayOfInt objectAtIndex: arrayIndex ] intValue];

//...replace arrayOfInt (write)
[self.arrayOfInt replaceObjectAtIndex: arrayIndex withObject: [NSNumber numberWithInt: arrayValue ]]; 

4 个答案:

答案 0 :(得分:2)

如果你想在Objective-C中使用int array [7],你可以编写

int array [7];

Objective-C是C的扩展。每个C代码都是合法的Objective-C代码。还有Objective-C ++,它是C ++的扩展,所以你可以在Objective-C中使用std :: array。

另一方面,如果你想要一个大小可调的数组,在C中你必须使用malloc,realloc,跟踪大小,跟踪生命,在正确的时间免费通话,担心悬空指针,这在Objective-C中更容易处理。

答案 1 :(得分:1)

你也可以用更短的方式写出相同的内容(如果你要问的话......),就像这样:

// ... DECLARE ARRAY

property ( atomic, strong ) NSMutableArray *ARRAY;

// ...分配和初始化阵列

_ARRAY = [NSMutableArray new];

// ...填写ARRAY(写)

[_ARRAY addObject:@( VALUE )];

// ...使用值

声明数组
_ARRAY = @[ @( INT1 ), @( INT2 ), @( INT3 ) ];

// ...阅读

int VALUE = [[_ARRAY objectAtIndex:INDEX] intValue];

// ...替换(写)

[_butOnStars replaceObjectAtIndex:INDEX withObject:@( VALUE )];

答案 2 :(得分:1)

一旦我开始使用objC,就会达成一致,但现代语法

会更好

让我们比较两者:

@property (atomic, strong)  NSMutableArray *ARRAY;
//c array
@property (atomic, strong)  int *ARRAY;

看起来一样。

分配和初始化阵列

self.ARRAY = [NSMutableArray array];
self.ARRAY = [@[@1, @2, @3, @4] mutableCopy];
//c array
self.ARRAY = malloc(numElements*sizeof(int));

绝对偏爱NSMutableArray

DEALLOCATE ARRAY

self.ARRAY = nil; //not really needed
//c array
free(self.ARRAY);self.array=nil;

绝对偏爱NSMutableArray

...填写ARRAY(写)

[self.ARRAY addObject: @(VALUE)];
self.ARRAY[ARRAY.count] = @(VALUE);
//c array
Not existent

绝对偏爱NSMutableArray

...阅读

VALUE = [self.ARRAY[INDEX] intValue];
//c array
VALUE = self.ARRAY[INDEX];

C数组得到了点

...替换(写)

self.ARRAY[INDEX] = @(VALUE);
//c array
self.ARRAY[INDEX] = VALUE;

差不多

总结: 使用NSMutableArray时,您可以更轻松地进行内存管理,快速枚举,一些奖励方法和几乎相同的代码。权衡是你有这个NSNumber创建和objC消息。所以,如果它是关于速度的,我绝对会选择c阵列。但对于大多数情况来说,NSArray足够好了。并且不必调试badAccess错误但得到正确的indexOutOfBounds错误;)

答案 3 :(得分:1)

iOS的数组类型“很重”,因为它们做了很多,而且它们是必须初始化的对象。

如果你选择这样做,你可以使用c风格的数组,但是你没有使用数组类型的好处。