[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}
详细倾参考资料
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)