无法识别的选择器发送到实例 Objective-C

Posted

技术标签:

【中文标题】无法识别的选择器发送到实例 Objective-C【英文标题】:Unrecognized selector sent to instance Objective-C 【发布时间】:2016-10-20 10:47:13 【问题描述】:

我收到错误:

由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:'-[__NSCFConstantString subjectType]: 无法识别的选择器发送到实例

我正在尝试按学生正在学习的学科类型将我的应用程序中的学生排序到数组中。

AMStudent* student = [[AMStudent alloc] init];

NSMutableArray* studentArray = [[NSMutableArray alloc] init];

NSArray* studentNameArray = [NSArray arrayWithObjects: @"Student1",  @"Student2", @"Student3", @"Student4", @"Student5", @"Student6", @"Student7", @"Student8", @"Student9", @"Student10", nil];

[studentArray addObjectsFromArray:studentNameArray];

for (NSInteger i = 0; i < [studentNameArray count]; i++) 

    student.name = [studentNameArray objectAtIndex: i];
    [student randomAnswer];
    NSLog(@"%@", student.description);



NSMutableArray* techArray = [NSMutableArray array];
NSMutableArray* humArray = [NSMutableArray array];

for (AMStudent* stud in studentArray)

    if ((stud.subjectType & AMStudentSubjectTypeDevelopment) | (stud.subjectType & AMStudentSubjectTypeMath)) 
        [techArray addObject:stud];
     else 
        [humArray addObject:stud];
    

我无法弄清楚我到底做错了什么,因为它在这个阶段崩溃了:

if ((stud.subjectType & AMStudentSubjectTypeDevelopment) | (stud.subjectType & AMStudentSubjectTypeMath)) 
        [techArray addObject:stud];
     else 
        [humArray addObject:stud];
     

【问题讨论】:

异常信息是什么?它会告诉你类是什么以及发送的选择器是什么。 'Unrecognized selector sent to instance'的可能重复 添加详细的崩溃日志。 如果对象为零,您将遇到此崩溃。你是对象不是零 @gurmandeep 你可以将任何选择器发送到目标c中的nil,它不会崩溃;它只是返回 nil。 【参考方案1】:

你在打电话

stud.subjectType 

将studentNames(NSString)复制到学生数组后的studentArray中:

[studentArray addObjectsFromArray:studentNameArray];

NSString 无法识别 subjectType。

【讨论】:

【参考方案2】:

您填写studentArray 使用:

[studentArray addObjectsFromArray:studentNameArray];

所以studentArray 包含NSString 实例。然后,您尝试使用以下方法处理数组:

for (AMStudent* stud in studentArray)

不会神奇地将studentArray 中的NSString 实例转换为AMStudent 实例。此时您不会收到错误,因为studentArray 可以包含任何类型的对象,因此编译器只相信您知道自己在做什么,并将对NSString 的引用放入stud。然后你做:

   if ((stud.subjectType ...

这需要stud 引用AMStudent 对象,它没有,它引用一个(常量)字符串,所以你得到错误:

NSInvalidArgumentException',原因:'-[__NSCFConstantString subjectType]:发送到实例的选择器无法识别

您需要创建AMStudent 的实例并将它们添加到数组中,而不是将学生的姓名复制到studentArray。您是否打算在第一个循环中这样做?

HTH

【讨论】:

非常感谢您的广泛回答,我明白我的错误:【参考方案3】:

techArray 和 humArray (NSArray) 类型更改不起作用添加对象功能。

NSMutableArray *newtechArray = [techArray mutableCopy];


NSMutableArray *newhumArray = [humarray mutableCopy];

if ((stud.subjectType & AMStudentSubjectTypeDevelopment) | (stud.subjectType & AMStudentSubjectTypeMath)) 
        [newtechArray addObject:stud];
     else 
        [newhumArray addObject:stud];
     

【讨论】:

【参考方案4】:

非常感谢您的广泛回答,我理解我的错误。刚刚添加了一个循环并添加了对象学生。

for (NSInteger numberOfStudents = 0; numberOfStudents < 10; numberOfStudents ++)

    AMStudent* student = [[AMStudent alloc] init];
    student.name = [studentNameArray objectAtIndex:numberOfStudents];



[studentArray addObject:student];

【讨论】:

以上是关于无法识别的选择器发送到实例 Objective-C的主要内容,如果未能解决你的问题,请参考以下文章

Swift无法识别的选择器发送到实例错误

目标-c:无法识别的选择器发送到实例 0x8d75720

UITableViewController 无法识别的选择器发送到实例

无法识别的选择器发送到实例

[UICollectionViewCell imageView]:无法识别的选择器发送到实例

UISwipeGesture '发送到实例的无法识别的选择器'