尝试将对象添加到可变数组时发送到实例的无法识别的选择器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试将对象添加到可变数组时发送到实例的无法识别的选择器相关的知识,希望对你有一定的参考价值。

我正在关注“Your Second iOS App”,我决定使用代码来理解Objective C ...

我想要做的只是将一个对象添加到类中的可变数组中。以下是课程:

BirdSighting.h

#import <Foundation/Foundation.h>

@interface BirdSighting : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *location;
@property (nonatomic, copy) NSDate *date;

-(id) initWithName: (NSString *) name location:(NSString *) location date:(NSDate *) date;
@end

BirdSighting.m

#import "BirdSighting.h"

@implementation BirdSighting
-(id) initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];

    if(self) {
        _name = name;
        _location = location;
        _date = date;

        return self;
    }

    return nil;
}

@end

BirdSightingDataController.h

#import <Foundation/Foundation.h>
@class BirdSighting;

@interface BirdSightingDataController : NSObject
@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

- (NSUInteger) countOfList;
- (BirdSighting *) objectInListAtIndex: (NSUInteger) theIndex;
- (void) addBirdSightingWithSighting: (BirdSighting *) sighting;
@end

BirdSightingDataController.m

#import "BirdSightingDataController.h"

@implementation BirdSightingDataController
- (id) init {
    if(self = [super init]) {
        NSMutableArray *sightingList = [[NSMutableArray alloc] init];
        self.masterBirdSightingList = sightingList;
        return self;
    }

    return nil;
}

-(NSUInteger) countOfList 
{
    return [self.masterBirdSightingList count];
}

- (BirdSighting *) objectInListAtIndex: (NSUInteger) theIndex
{
    return [self.masterBirdSightingList objectAtIndex:theIndex];
}

- (void) addBirdSightingWithSighting: (BirdSighting *) sighting
{
    [self.masterBirdSightingList addObject:sighting];
}
@end

这是我试图将BirdSighting实例添加到可变数组的地方:

#import "BirdsMasterViewController.h"
#import "BirdsDetailViewController.h"

#import "BirdSightingDataController.h"
#import "BirdSighting.h"

@implementation BirdsMasterViewController

- (void)awakeFromNib
{
    [super awakeFromNib];

    BirdSightingDataController *dataController = [[BirdSightingDataController alloc] init];

    NSDate *date = [NSDate date];
    BirdSighting *sighting = [[[BirdSighting alloc] init] initWithName:@"Ebabil" location:@"Ankara" date: date];

    [dataController addBirdSightingWithSighting: sighting];
    NSLog(@"dataController: %@", dataController.masterBirdSightingList);

    self.dataController = dataController;

}
..........
@end

它在BirdSightingDataController addBirdSightingWithSighting方法中抛出NSInvalidArgumentException ...

我究竟做错了什么?

这是完整的调试输出:2012-11-26 01:22:38.495 BirdWatching [4597:c07] - [__ NSArrayI addObject:]:无法识别的选择器发送到实例0x71899d0 2012-11-26 01:22:38.496 BirdWatching [4597: c07] *由于未捕获异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSArrayI addObject:]:无法识别的选择器发送到实例0x71899d0'

答案

这一行:

BirdSighting *sighting = [[[BirdSighting alloc] init] initWithName:@"Ebabil" location:@"Ankara" date: date];

应该:

BirdSighting *sighting = [[BirdSighting alloc] initWithName:@"Ebabil" location:@"Ankara" date: date];

你不能调用两个初始化器。

更新:

根据完整的错误消息,我现在看到了问题。你认为你拥有的NSMutableArray真的是一个NSArray。这是通过使用copy定义属性引起的。

为属性定义copy时,它会生成对象的不可变副本。因此,当您分配NSMutableArray时,会生成一个不可变的副本,然后将其分配给实例变量。所以你最终分配了一个NSArray,而不是NSMutableArray

修复方法是更改​​属性定义:

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

至:

@property (nonatomic, strong) NSMutableArray *masterBirdSightingList;
另一答案

如果您阅读错误消息,则说“addObject”被“发送”到NSArray,这是无效的。这是真的。如果你查看NSArray的规范,你将找不到方法“addObject”。

在某处你有一个NSArray,你正在尝试执行“addObject”。有点难以分辨,因为你显然没有列出发生错误的代码部分,或者你在某个地方设置“masterBirdSightingList”到NSArray,首先使它成为NSMutableArray。

另一答案

0

我有类似的错误说:无法识别的选择器发送到NSMutable数组的实例..经过很多事情后,我发现我使用我的可变数组作为属性作为

@property(assign,nonatomic)NSMutableArray * myMutableArray;

虽然复制粘贴而没有引起注意,但却导致了问题。

解决方案我们将其更改为强类型(您可以将其更改为任何其他类型,如强/弱等...根据您的要求)。所以我的案例中的解决方案是:

@property(强,非原子)NSMutableArray * myMutableArray;所以,复制粘贴时要小心!做一次检查。

以上是关于尝试将对象添加到可变数组时发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIPanGesture 时发送到实例的无法识别的选择器

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

发送到实例的 iOS 无法识别的选择器 - 将 NSDictionary 添加到 NSMutableArray

iOS - 名称标签时出现“无法识别的选择器发送到实例”错误

链接静态库时将无法识别的选择器发送到实例?

尝试将帖子写入 Firebase 实时数据库时遇到无法识别的选择器发送到实例错误”