gpt4 book ai didi

objective-c - NSNumber 导致应用程序崩溃

转载 作者:行者123 更新时间:2023-12-02 04:31:29 25 4
gpt4 key购买 nike

我在 .h 文件中有 @property 不透明度

@property (assign) NSNumber *opacity;

然后在.m文件中我

@synthesize opacity;

然后在

- (id)initWithFrame:(NSRect)frame

我做到了

 opacity = [NSNumber numberWithFloat:1.0];

当我运行应用程序时,Xcode 显示此错误

Thread 1: EXC_BAD_ACCESS (code-EXC_I386_GPFLT)

但是,如果我将该行更改为

opacity = [NSNumber numberWithInteger:1];

一切正常。

最佳答案

看起来效果很好。但您刚刚用 NSNumber 的实现细节覆盖了该错误。

正如 Volker 指出的那样,您存在内存管理问题。您的资源应使用strong。如:

@property (strong) NSNumber *opacity;

并且您应该在赋值时使用该属性。例如:

self.opacity = [NSNumber numberWithFloat:1.0];

那么为什么它可以与 [NSNumber numberWithInteger:1] 一起使用?因为 iOS 试图变得智能。整数 1 NSNumber 是一个永远不会被释放的单例对象。 [NSNumber numberWithFloat:1.0] 并不是一个坚不可摧的对象,一旦引用计数降至零,它就会被释放。当您离开创建 NSNumber 实例的范围后,就会发生这种情况,因为它永远不会保留在您的代码中。

您可以使用这个小日志代码查看单例行为,该代码记录 NSNumber 实例的指针地址:

NSLog(@"Address of `[NSNumber numberWithFloat:1.0]`: %p", [NSNumber numberWithFloat:1.0]);
NSLog(@"Address of `[NSNumber numberWithInteger:1]`: %p", [NSNumber numberWithInteger:1]);

NSLog(@"Address of `[NSNumber numberWithFloat:1.0]`: %p", [NSNumber numberWithFloat:1.0]);
NSLog(@"Address of `[NSNumber numberWithInteger:1]`: %p", [NSNumber numberWithInteger:1]);

产生

Address of `[NSNumber numberWithFloat:1.0]`: 0x10c622d10
Address of `[NSNumber numberWithInteger:1]`: 0xb000000000000013
Address of `[NSNumber numberWithFloat:1.0]`: 0x10c129fb0
Address of `[NSNumber numberWithInteger:1]`: 0xb000000000000013

如您所见,numberWithFloat:1.0 中的两个地址不同,而 numberWithInteger:1 中的两个地址相同。因为 [NSNumber numberWithInteger:1] 总是返回相同的对象。

关于objective-c - NSNumber 导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23006187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com