2010-10-01 72 views
-1
返回错误

我试图返回一个NSMutableArray的,但我得到这个错误在控制台:中的NSMutableArray

2010-10-01 14:12:21.348 电话簿[1424:A0F] + [链表 getListArray]:发送到类无法识别选择 0x1000053e8

该方法的代码是:

- (id)getListArray { 
ListNode *tmp = iterator; 
iterator = head; 

NSMutableArray * list = [NSMutableArray arrayWithCapacity:self.getNSIntegerNum]; 

while ([iterator next] != nil) { 
    [list addObject:[iterator data]]; 
} 

iterator = tmp; 

return list; 

} 

和方法调用:

contacts = [LinkedList getListArray];

“接触” 是一个已经初始化的NSMutableArray对象。 任何想法?

+1

你很明显需要购买一本关于可可的书来铺路。如果“contacts [really]是一个已经初始化的NSMutableArray对象”,那么你刚刚得到了内存泄漏或对Objective-C的重大误解。 – 2010-10-02 00:06:13

回答

3

它看起来像你调用getListArray,就好像它是一个类方法,但它被定义为一个实例方法。

您需要将getListArray定义为类方法(+而不是-),或者创建一个LinkedList实例并调用getListArray。

// Best guess code sample. 
LinkedList *myLinkedList = [[LinkedList alloc] init]; 
contacts = [myLinkedList getListArray]; 
[myLinkedList release]; 
+0

对不起,我没有粘贴类实例化的代码。在我的代码中,我创建了一个像你一样的实例。我已经有了这门课的工作方法。 =更奇怪。 – 2010-10-01 17:45:44

+0

@Leonardo Suzan:你创建了一个实例并不重要 - 你仍然在向类本身发送getListArray。在你的问题中是正确的:'[LinkedList getListArray]' - 这是给类的消息,而不是任何特定的实例。 – Chuck 2010-10-01 17:50:55

+0

你可以发布你实例化你的LinkedList对象的代码吗?我认为这会有很大的帮助。 – 2010-10-01 18:30:42

0
contacts = [LinkedList getListArray]; 

触点是一个已经初始化的NSMutableArray对象。

还是这样。如果消息已经通过(即,如果LinkedList类对此消息作出响应,或者如果您要将它发送给LinkedList实例),则此分配将替换您之前创建并存储到contacts中的阵列,并创建阵列由getListArray返回。

请记住:contacts变量不是数组。它是指向(数组)对象的指针的容器。你说你以前创建了一个数组,并将其指针存储在这个变量中;现在您正在尝试获取另一个数组,并将指针存储在此变量中,该指针将替换之前的指针。

事实上,您没有更换contacts数组的唯一原因是Robot K指出的原因:您正在向LinkedList类发送消息,但只有LinkedList实例会响应该消息。

有两种解决方案都创建一个冗余阵列和异常:

  1. 重命名getListArraygetListArray:,并使其采取一个NSMutableArray作为它的参数和数组中填写。
  2. 停止预先创建一个空数组(不需要)并将getListArray消息发送到LinkedList实例而不是LinkedList类。后者是Robot K建议的。

我推荐解决方案#2。

当人们进行冗余创建对象错误时,他们经常会泄漏冗余对象(one example);你还没有显示前一个数组的创建,所以我看不出你是否做到了这一点,所以,以防万一,我也建议你阅读或重读the Memory Management Programming Guide for Cocoa