Enums iOS 10 NSNumber与枚举一起崩溃

Enums iOS 10 NSNumber与枚举一起崩溃,enums,ios10,nsnumber,Enums,Ios10,Nsnumber,我遇到了一个非常奇怪的问题,关于我枚举值的NSNumber对象,以及在运行iOS 10版的设备上访问它们 作为免责声明,此问题在其他iOS版本中不会发生 我声明了一个枚举,如下所示: typedef NS_ENUM(NSInteger, MYENUM) { FIRST = 1500, SECOND = 1700, THIRD = 1900, ... }; 使用此枚举时,我将以以下方式传递它: [[MyObject alloc] initObjectWith:@(FIRS

我遇到了一个非常奇怪的问题,关于我枚举值的
NSNumber
对象,以及在运行iOS 10版的设备上访问它们

作为免责声明,此问题在其他iOS版本中不会发生

我声明了一个枚举,如下所示:

typedef NS_ENUM(NSInteger, MYENUM) {
   FIRST = 1500,
   SECOND = 1700,
   THIRD = 1900,
   ...
};
使用此枚举时,我将以以下方式传递它:

[[MyObject alloc] initObjectWith:@(FIRST)];
排除内部逻辑,我在字典中使用enum,因此需要将其转换为NSNumber

执行此操作时,应用程序崩溃,因为枚举不知何故不是NSNumber,而是NSIndexPath

为什么会发生这种情况?

当我删除装箱文本并更改方法签名以接受NSInteger时,此崩溃消失

我曾尝试在网上搜索这类问题,但都没有找到答案

进一步解释(根据评论)

myObject的init方法内部没有特殊逻辑,只是将定义为
NSNumber
的属性分配给传递的参数

关于崩溃日志,Xcode在提供不太有用的崩溃日志方面臭名昭著,我看到的只是
EXC\u BAD\u ACCESS
,这可能意味着访问已释放的对象或潜在的内存泄漏

MyObject类的定义如下:

头文件:

@interface ISNEvent : NSObject

@property(nonatomic, assign) NSNumber* number;

-(instancetype)initObjectWith:(NSNumber*)number;

@end
.m文件:

- (instancetype)initObjectWith:(NSNumber*)number {
   self = [super init];
   if (self) {
     _number = number;
   }

   return self;
}

您已使用
assign
内存语义定义了属性:

@property(nonatomic, assign) NSNumber* number;
这意味着您将获得对您提供的任何内容的引用,但您不会保留强引用,并且在对象解除分配时也不会
nil
您的引用。这是两种情况中最糟糕的一种,因为您保留了一个悬空引用,指向一个允许解除分配的对象。正如您所说,这个特定的错误“可能……意味着访问一个已经释放的对象”,而这正是这里发生的事情


你可以考虑暂时转向僵尸。(command+@Rob-根据您的评论更新了问题。@Rob-添加了类实现和EXC_BAD_ACCESS是我得到的错误。感谢您的详细回答。我能问一下为什么在其他操作系统版本中不会发生这种情况吗?@tomerpacific-这可能是他们为了最小化冗余实例化和释放而引入的优化有点像长期以来的
NSString
优化。但是你不能依赖它,所以使用
strong
限定符,你将永远是安全的。
@property(nonatomic, strong) NSNumber *number;