如何将数据插入到NSArray

如何将数据插入到NSArray,第1张

NSMutableArray *mutablearray

[mutablearray addObject:添加的对象]

或[mutablearray insertObject:添加的对象 atIndex:欲添加的位置]

通常用第一个

对大大的问题不是太清晰。

猜想是问如何将struct添加到nsarray当中。

nsarray支持的是objc对象。它并不支持原生的c struct变量

大大可以用nsvalue或者nsdata来作为struct的数据载体,将struct的地址放置在nsvalue或者nsdata当中。然后向nsarray添加。

CLLocationCoordinate2D coor

NSValue *value

NSArray *arr

coor = {11.00, 22.11}

value = [NSValue valueWithPointer:&coor]//或者 NSData data = [NSData dataWithBytesNoCopy:&coor length:sizeof(CLLocationCoordinate2D) freeWhenDone: NO]

arr = [NSArray arrayWithObject:value]//或者 arr = @[value]

如此便能向nsarray中放置struct。

需要特别注意的是内存管理方面的问题。

NSValue并不提供对pointer的内存管理手段,所以当pointer不再被使用的时候,大大需要人工释放这些内存空间。

NSData有提供这方面的手段。但是如果没有正确管理的话,会造成出错。

举个反面的例子:

typedef struct {int n} _s

NSValue *func(){

NSValue *v

_s a = {100}

v = [NSValue valueWithPointer:&a]

return v

}

int main(){

NSValue *v

_s b

v = func()

b = (_b)v.pointerValue

printf("%d“, b.n)//出错

}

上面的例子中,由于NSValue保存的是一个局域的变量,次变量会在func结束后自动被释放,所以func所返回的NSValue所保存的指针会失效。

正确的做法应该是:

_s *a

a = (_s *)malloc(sizeof(_s))//分配内存

v = [NSValue valueWithPointer:a]

使用完后:

b = v.pointerValue

printf("%d“, b.n)

free(b)//释放内存

事实上NSData在这种情况更合适

v = [NSData dataWithBytesNoCopy:&a length:sizeof(_s) freeWhenDone: YES]

这样可以使得指针a伴随NSData v的释放而释放。

=====================

另外,也许大大问的是NSArray的创建的 short cut。

事实上

Apple LLVM Compiler 4.0 和 open-source LLVM clang v3.1对NSArray, NSDictionary 和 NSNumber 有了语法上的新支持:

NSNumber *num = @(1+3)

NSArray *arr = @[num, @"hello"]

NSDictionary *dict = @{@"num" : num}

详细倾参考资料


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11685493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存