2011-05-26 104 views
13

当试图存储双或int字典中的双重我得到一个错误广东话店int或在字典

error: Semantic Issue: Sending 'double' to parameter of incompatible type 'id'

我有以下代码

[data setValue:longitude forKey:@"longitude"]; 

经度是双。

我该如何储存?我应该只是创建一个int或双重指针?

回答

20

至于其他职位都表示,你需要使用一个NSNumber中的对象来包装你的双重价值。原因是所有的Cocoa基础集合类都被设计为使用对象而不是原始值。如你所说,有一些工作,你实际上可以将指针传递给双值(我想,如果你设法将它转换为id类型的指针),但只要你的方法完成,双出去的范围之会被释放,你的指针现在会指向垃圾。通过一个对象,这个集合(在这种情况下为NSDictionary)会在你的对象被添加时保留下来,当它被移除或者集合被删除时释放它,确保你的价值能够存在,直到你不再需要它为止。

如下我会做到这一点:
NSNumber *tempNumber = [[NSNumber alloc] initWithDouble:longitude];
[data setValue:tempNumber forKey:@"longitude"];
[tempNumber release];

这将留下您的NSNumber对象只有一个+1引用计数(字典保留它),并没有自动释放

做的其他建议的方法:
[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
也没关系,但你的对象将最终获得+1引用计数从numberWithDouble方法的一个自动释放。如果可能,我尽量避免自动释放,但代码更简洁。因人而异。

+1

[NSNumber的numberWithDouble::]是一种自动释放物体...,因为它是从一个方便的类方法形成,并且按照惯例那些被返回为-C字面语法从类型的双变量创建的NSNumber自动释放。 – 2011-05-30 07:08:19

2

您必须改用NSNumber对象。尝试宣告经度如下

NSNumber longitude = [NSNumber numberWithDouble:myLongitude]

6

尝试使用一个NSNumber:

[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
3

字典需要一个NSObject,而不是一个数字或指针。然而,它很容易地创建包含数字的对象:

NSNumber *mylongitudeObject = [NSNumber numberWithDouble:myLongitude]; 

,你可以从那里存储在一个NSDictionary。

引擎盖下:mylongitudeObject实际上是一个指向包含数字副本的不透明结构的指针;但结构也包含信息,以便目标C运行时知道它可以用这个对象做,比如如何将它

0

复制到字典等。随着编译器的新版本,你可以使用Objective

double longitude = 2.0; 
dict[@"longitude"] = @(longitude);