目标-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
performSegueWithIdentifier 处的“无法识别的选择器发送到实例”