Iphone 分配NSN编号时出现问题

Iphone 分配NSN编号时出现问题,iphone,objective-c,Iphone,Objective C,我在一个名为Reservation的类中有一个NSNumber*did的实例。 myres下面是一个预订实例 myres.did = [[NSNumber alloc] initWithInt:[[[data objectForKey:@"discount"] did] intValue]]; 当我这样做的时候,一切都很好。但是代码很难看,当我这样做时: myres.did = [data objectForKey:@"discount"] did]; 我的密码坏了。。我知道[[data o

我在一个名为Reservation的类中有一个NSNumber*did的实例。 myres下面是一个预订实例

myres.did = [[NSNumber alloc] initWithInt:[[[data objectForKey:@"discount"] did] intValue]];
当我这样做的时候,一切都很好。但是代码很难看,当我这样做时:

myres.did = [data objectForKey:@"discount"] did];
我的密码坏了。。我知道[[data objectForKey:@discount]did]返回一个对象,它是一个NSNumber


能解释一下为什么会这样吗?如果我想用另一个NSNumber分配一个NSNumber,我需要在代码中更改什么?

代码在哪里分解?您的应用程序中是否发生崩溃

顺便说一下,在第二个示例中,您有一组不匹配的方括号


在概念层面上,第一个代码示例将保留对象放入myres.did,而第二个示例将自动释放对象放入myres.did。如果以后使用截取的第二个代码在myres.did上发布,则可能会发生崩溃。

请查看复制NSNumber的背景信息。

首先确保将对象的属性设置为保留:

并且您正在释放dealloc中的对象

不幸的是,您现有的副本不能再短了。您对本声明的实际操作:

myres.did = [[NSNumber alloc] initWithInt:[[[data objectForKey:@"discount"] did] intValue]];

从一个NSNumber引用中获取整数值并将其移动到另一个NSNumber引用中。整数内容是非引用赋值,可以这样移动。无法复制NSNumber本身,因为它是不可变的。有关更多信息,请参阅。您的代码中肯定有另一个问题,可能是不适当的版本。

我仍然收到一个错误,复制与执行initwithint相同吗?当你复制的时候,你实际上是在做一个alloc,还是我们假设左侧已经被alloc,成员实例是不可变的,所以发送一个copy消息和发送retain消息是一样的。NSNumber的拷贝实现实际上并不创建拷贝;建议的解决方案是错误的,它掩盖了一个更严重的内存管理缺陷。OP应发布did属性的声明。内存管理语义很可能是赋值的,但应该改为保留。我认为Matt Bishop是对的,所以我投了赞成票。原始海报的myres.did被分配了一个全新的NSNumber。他想要一个简短的陈述,这个解决方案得到了回答;如果内存管理正确,存储一个引用并在“myres”中保留相同的NSNumber对象是完全可以的。如果“数据”后来被解除分配并释放了该NSNumber对象,则不应解除分配NSNumber本身,除非在其他地方存在错误@jlehr是正确的,这种复制策略只是笨拙地掩盖了其他一些内存管理错误。顺便说一句,[NSNumber numberWithInt:[someOtherNSNumber intValue]]不一定返回其他实例。例如,当前在Mac上,整数小于12的情况下,实际上会返回相同的实例。
myres.did = [[NSNumber alloc] initWithInt:[[[data objectForKey:@"discount"] did] intValue]];