【发布时间】:2011-09-02 07:08:04
【问题描述】:
我在使用 NSMutableArray 时遇到了一些问题。我确定我在分配 NSMutableArray 时做错了,但作为 iPhone 新手,这对我来说并不明显。当我运行下面的代码时,我可以将对象 MyObject 添加到数组 objects_ 并设置名称等。NSLog 显示正确的数据。
但是当我尝试从函数 printObject 访问 objects_ 成员时,我得到了一个 SIGABRT。看起来内存已被释放或什么?
任何帮助表示赞赏。
@interface MyObject : NSObject {
NSString *name;
}
-(void) SetName:(NSString*) name_str;
-(NSString*) GetName;
@end
@interface ObjectListViewController : UITableViewController {
NSMutableArray* objects_;
}
-(void) initTableData;
@end
@implementation ObjectListViewController
- (void)initTableData {
objects_ = [[NSMutableArray alloc] initWithCapacity:10];
MyObject *obj = [MyObject alloc];
[obj SetName:@"Test"];
[objects_ addObject:obj];
MyObject* testObj = (MyObject*)[objects_ objectAtIndex:0];
NSLog([testObj GetName]);
}
- (void)printObject {
MyObject* testObj = (MyObject*)[objects_ objectAtIndex:0];
NSLog([testObj GetName]);
}
【问题讨论】:
-
好吧,对于初学者来说,你永远不会在@interface 中定义 printObject。
-
此代码看起来不错,因此您缺少问题代码。您确定
initTableData正在被调用吗?在调用printObject之前,还有什么可能触及objects_吗? SIGABRT 是不寻常的,尤其是在控制台中没有消息的情况下。这不是一个糟糕的选择器,也不是一个空数组,两者都会输出有用的调试信息。 -
@quixoto:代码看起来不太好。他从不初始化 obj。
-
@JeremyP:是的。连同您在回答中提到的所有其他要点。不过,它们都没有解决 SIGABRT 的奥秘。 :) 当然,除非——我现在愿意打赌就是这种情况——调试控制台中有一些有用的信息,OP 没有与我们共享。
标签: iphone objective-c