1

我想,当程序获取在“ - [CFString字符串respondsToSelector:]:消息发送到释放实例”试图访问objectArray

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

我最后一排旁加载10行中的tableView数据时,使用带pagenumber参数的单个函数来加载连续页面。 它适用于首次提取,即页面编号为0,但是当我再次调用它来获取下一个页面的行,它给了我这个错误

-[CFString respondsToSelector:]: message sent to deallocated instance 

敲我的头很长一段时间后,我发现,它创建尝试访问我的Model对象的NSMutableArray时出现此问题。 我使用这种方式:

TableRowObjectClass* TempObject = [[TableRowObject alloc] init]; 
for(int i=0;i<rowArray.count;i++){ 
    TempObject = [rowArray objectAtIndex:i]; 
    NSString* objectProperty = [[[NSString alloc] initWithFormat:@"String Property I need from Object to be appended with some text from TableRowObject Class : %@",TempObject.objProperty] retain]; 
    [propertyArray addObject:objectProperty]; 
    [objectProperty release]; 
} 

在这里我得到模型对象(TableRowObjectClass的对象)的数组,我想从TempObject提取OBJECTPROPERTY以及创建和所有这些属性的阵列。 最初,对于pagenumber 0,它获取20行,现在当我显示第20行时,我调用fetch,它调用此函数创建一个全新的objectProperty Array,我呼叫[TableView reloadData]显示20(旧)+20的frsh feed (新鲜)饲料。

现在它试图访问时产生这个错误

-[CFString respondsToSelector:]: message sent to deallocated instance 

NSString* objectProperty = [[[NSString alloc] initWithFormat:@"String Property ....TableRowObject Class: %@",TempObject.objProperty] retain]; 

我不知道什么以及它从哪儿得到dealloc。 我已经花了很多时间在这方面,而我对objective-c内存管理并不太擅长。

非常感谢您的帮助。

+0

TableRowObject是一个类还是变量?你似乎正在使用它两种方式。 – Chuck 2011-02-23 04:17:37

+0

它是一个拥有自己的init方法的类。它的对象是通过解析JSON数据创建的,并以这些对象的NSMutable数组的形式返回。 – Daffy 2011-02-23 04:29:01

+0

感谢您指出,我在上面的帖子中修复了它。这不是实际的代码。 (不能粘贴确切的代码,公司政策)我试图展示功能,这与上面提供的代码类似。 – Daffy 2011-02-23 04:40:40

回答

1

没有必要使用

NSString* objectProperty = [[[NSString alloc] initWithFormat:@"String Property ....TableRowObject : %@",TableRowObject.objProperty] retain]; 

你甚至可以用

NSString* objectProperty = [NSString stringWithFormat:@"String Property ....TableRowObject : %@",TableRowObject.objProperty]; 
+0

我最初使用 (的NSString * OBJECTPROPERTY = [NSString的stringWithFormat:@ “String属性.... TableRowObject:%@”,TableRowObject.objProperty])仅 ,但在绝望解决这个缺陷,和没有自动释放任何对象,我用 (NSString * objectProperty = [[[NSString alloc] initWithFormat:@“String Property .... TableRowObject:%@”,TableRowObject.objProperty] retain];) 。 – Daffy 2011-02-23 04:26:25

+0

你在TableRowObject中有什么样的对象 – Swastik 2011-02-23 04:29:58

+0

我自己定义了这个类,它是一个从NSObject继承的常规类。 – Daffy 2011-02-23 04:34:14

5

你的代码非常清楚地表明,你不明白的Objective-C或Objective-C的内存管理;不用担心,我们都开始了。首先阅读Objective-C guide,然后Memory Management guide

一些具体问题:

TableRowObjectClass* TempObject = [[TableRowObject alloc] init]; 
TempObject = [someArray objectAtIndex: 0]; 

泄漏。在第一行分配的对象(该变量也应以小写字母开头)。

此:

NSString* objectProperty = [[[NSString alloc] initWithFormat:@"..."] retain]; 
[objectProperty release]; 

双保留由单个释放,另一泄漏平衡。

您所看到的message sent to deallocated instance错误表示您过度释放其他对象。遵循内存管理指南,使用“构建和分析”,然后使用僵尸检测工具....

+0

感谢您的意见。 我遇到了另一个问题,我正在使用一个类方法并返回一个字典。但是,当我尝试将它初始化为autorelease时,应用程序崩溃,因为它在另一个类方法中使用 – Daffy 2011-02-23 21:28:37

+0

从类方法或实例方法返回的对象使内存管理无关紧要。 .. – bbum 2011-02-24 07:37:16

相关问题