访问NSMutableArray成员变量时崩溃

时间:2010-09-07 02:15:06

标签: iphone objective-c

我在使用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]);
}

4 个答案:

答案 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)

以下是您的代码中的一些问题:

  • 您永远不会初始化MyObj对象。虽然它直接从NSObject继承并且NSObject被记录为除了返回self之外什么也不做,你永远不知道其他东西是否在幕后发生,所以把它放在一边就是为了消除这种可能性。
  • 您的方法不遵循正常的命名约定。方法名称应以小写字母开头,“get”只应在通过参考通过引用传回数据时使用,例如, NSData -getBytes:length:。您的getter和setter应分别为-name和-setName :.这似乎是一个小小的挑剔,但如果你开始使用KVO和KVC,它会帮助你。
  • 永远不要NSLog(someStringVariable)始终NSLog(@"%@", someStringVariable)。如你所知,如果对象的名称包含百分比格式序列,例如%@,%d,%s等,您的程序将在NSLog上崩溃。但是,这不是您当前问题的原因 - 它会在-initTableData中的NSLog上崩溃
  • 您不需要转换-objectAtIndex:
  • 的结果

说了这么多,我看不到任何会导致你遇到的特殊问题的事情。可能是MyObject中名称的getter或setter不正确。请发帖。