我在使用NSMutableArray时遇到了一些麻烦。我确定我在NSMutableArray的配置上做错了,但对我来说,作为一个iPhone新手并不明显。当我运行下面的代码时,我可以将对象MyObject添加到数组对象_并设置名称等.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]);
}
答案 0 :(得分:3)
我们可以消除 MyObject 上缺少init调用作为崩溃的原因,因为在这种情况下它将是良性的。在NSObject上调用init将只返回self,因此在这种情况下调用它不会改变行为。所以我认为这里的前两个答案会有所不同:
在初始化对象之前,尚未准备好使用该对象。 NSObject类中定义的init方法不进行初始化;它只是回归自我。
Chuck正确地指出 init 是object allocation and initialization中的基本步骤,您应该在分配 MyObject 时调用它。
我不确定第三个答案是否正确。我真的没有看到如何在对象_ 数组上添加合成会有什么不同。你没有将它定义为属性,我不明白为什么你需要,因为它只是类内部的数据。
关于问题的评论嗯,对于初学者,你永远不会在@interface中定义printObject。来自eykanal也不会对你有任何帮助,因为你必须在内部调用printObject ,否则你不会遇到崩溃。
通过代码阅读,我看不出明显的错误。 initTableData 完成后对象_ 的保留计数应为1, MyObject 实例上的保留计数也应为1。所以我认为必须有一些其他代码在其他地方发布 objects _ ?
我假设它在 objectAtIndex 调用时崩溃了吗?控制台中有没有信息?调用堆栈是什么样的?
答案 1 :(得分:1)
MyObject *obj = [MyObject alloc];
应该是:
MyObject *obj = [[MyObject alloc] init];
答案 2 :(得分:0)
@interface ObjectListViewController : UITableViewController {
NSMutableArray* objects_;
}
@property (nonatomic, retain) NSMutableArray *objects_;
-(void) initTableData;
-(void) printObject;
@end
在实现中添加合成
@implementation ObjectListViewController
@synthesize objects_;
答案 3 :(得分:0)
以下是您的代码中的一些问题:
NSLog(someStringVariable)
始终NSLog(@"%@", someStringVariable)
。如你所知,如果对象的名称包含百分比格式序列,例如%@,%d,%s等,您的程序将在NSLog上崩溃。但是,这不是您当前问题的原因 - 它会在-initTableData中的NSLog上崩溃说了这么多,我看不到任何会导致你遇到的特殊问题的事情。可能是MyObject中名称的getter或setter不正确。请发帖。