【问题标题】:Return error in NSMutableArrayNSMutableArray 中的返回错误
【发布时间】:2010-10-01 17:22:06
【问题描述】:

我正在尝试返回 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];

"contacts" 是一个已经初始化的 NSMutableArray 对象。 有任何想法吗?

【问题讨论】:

  • 你显然需要买一本关于 Cocoa 的书才能起步。如果“contacts [really] 是一个已经初始化的 NSMutableArray 对象”,那么你只是让自己发生了内存泄漏或对 Objective-C 的重大误解。

标签: objective-c cocoa nsmutablearray return


【解决方案1】:

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

您需要将 getListArray 定义为类方法(以 + 而不是 - 开头),或者创建 LinkedList 的实例并在其上调用 getListArray。

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

【讨论】:

  • 对不起,我没有在类实例化的地方粘贴解码代码。在我的代码中,我像您一样创建了一个实例。我已经在这堂课上有了工作方法。 =S 奇怪。
  • @Leonardo Suzan:你是否创建了一个实例并不重要——你仍在向班级本身发送getListArray。你的问题是对的:[LinkedList getListArray]——这是给班级的信息,而不是给任何特定的实例。
  • 你能贴出你实例化你的 LinkedList 对象的代码吗?我认为这会很有帮助。
【解决方案2】:
contacts = [LinkedList getListArray];

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

或者是。如果消息已通过(即,如果 LinkedList 类响应了此消息,或者您要将其发送到 LinkedList 实例),则此分配将用数组替换您之前创建并存储到 contacts 中的数组由getListArray创建并返回。

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

事实上,您不替换 contacts 数组的唯一原因是 Robot K 指出的原因:您将消息发送到 LinkedList 类,但只有 LinkedList 的实例响应该消息。

创建冗余数组和异常都有两种解决方案:

  1. getListArray 重命名为 getListArray:,并使其以 NSMutableArray 作为其参数并填充该数组。
  2. 事先停止创建空数组(您不需要)并将getListArray 消息发送到 LinkedList 的实例而不是 LinkedList 类。后半部分是机器人 K 建议的。

我推荐解决方案 #2。

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

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多