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

Posted

技术标签:

【中文标题】目标-c:无法识别的选择器发送到实例 0x8d75720【英文标题】:objective-c : unrecognized selector sent to instance 0x8d75720 【发布时间】:2014-04-15 06:56:34 【问题描述】:

我正在用 C 语言创建一个链接列表,添加时出现错误(还有警告)。

这两个都写在下面。

我尝试了一些无济于事的事情......任何建议都会很棒。

[它是一个最大大小的链表!]

//in the tester
XCTAssertNotNil(testList.head.next);

抛出此错误

 failed: ((testList.head.next) != nil) failed: throwing "-[__NSCFNumber next]: unrecognized selector sent to instance 0x8d75720"

这是添加方法

- (void)add:(NSObject *)node 
    Node *newNode = [[Node alloc] init];
    if (self.head)
        newNode.next = self.head;
    else
        self.head = newNode;
    self.num_nodes++;

 

NList *testList = [[NList alloc] initWithSize:2];

发出警告

不兼容的整数到指针的转换将“int”发送到“NSInteger *”类型的参数(又名“int *”)

这是构造函数

@property (nonatomic,readwrite) NSInteger size;

.....

- (id) initWithSize:(NSInteger *)size 
    self = [super init];
    if (self)
        self.head = nil;
        self.size = *size;
        self.num_nodes = 0;
    
    return self;

http://pastebin.com/SpW75Pf0

编辑

- (void)testAdd

    NList *testList = [[NList alloc] initWithSize:2];
    NSObject *testNodeOne =  @1;
    [testList add:(testNodeOne)];
    XCTAssertNotNil(testList.head);
    NSObject *testNodeTwo =  @3;

    [testList add:testNodeTwo];
    XCTAssertNotNil(testList.head);
    XCTAssertNotNil(testList.head.next);


head.next 抛出错误

/LinkedListTest.m: test failure: -[LinkedListTest testAdd] failed: ((testList.head.next) != nil) failed: throwing "-[__NSCFNumber next]: unrecognized selector sent to instance 0x8d75720"

=c

【问题讨论】:

第一个告诉 testList.head 返回 NSCFNumber 并且它没有名为 next 的属性 只是为了让您知道,如果您不分享所有代码,没有人会提供帮助。我无法访问 pastebin,所以我不会帮忙,就这么简单。这也与xcode IDE无关。 【参考方案1】:

您的-initWithSize: 方法采用指向NSInteger 的指针,但您试图传入NSInteger 而不是指向其中的指针。该方法没有理由采用指针,因为NSIntegers 适合堆栈并且您没有更改其值。方法签名应该是:

-(id) initWithSize:(NSInteger)size

(当然,您应该在方法中包含self.size = size;)。这将解决您收到的警告。

至于断言 - 看起来你已经到了列表的末尾。由于您没有包含断言周围的代码,因此无法说明为什么您会得到一个 nil next 指针。

【讨论】:

我在 pastebin 链接上有代码!同样,当我按照您现在所说的进行操作时,我通过构造函数的方法声明获得 ...types in implementation of 'initWithSize:': 'NSInteger *' (aka 'int *') vs 'NSInteger' (aka 'int') ! 如果你不在这里发布你的代码,其他人将无法理解这个问题和未来的答案。至于警告,您当然也必须更改方法原型。听起来你错过了那一步。 好的!我添加了断言代码!你对方法原型是正确的。我在那里检查过,但我没有注意到问题..我想是时候睡觉了,不是代码..哇。介意帮助解决其他错误吗? 我认为问题在于您没有正确执行插入操作。您是要在-add 方法中插入列表的前面还是后面?如果在前面,那么你的代码是不完整的。您不仅需要将newNode.next 设置为self.head,还需要将self.head 设置为newNode。如果你想要它在后面,那么你需要将self.head.next设置为newNode

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

无法识别的选择器发送到实例(iOS) - 自动WaitsToMinimiseStalling

在目标上调用 xxx 时抛出无法识别的发送到实例的选择器

performSegueWithIdentifier 处的“无法识别的选择器发送到实例”

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

无法识别的选择器发送到实例 NSArrayM [关闭]

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