Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 访问NSMutableArray成员变量时崩溃_Iphone_Objective C - Fatal编程技术网

Iphone 访问NSMutableArray成员变量时崩溃

Iphone 访问NSMutableArray成员变量时崩溃,iphone,objective-c,Iphone,Objective C,我在使用NSMutableArray时遇到了一些问题。我肯定我在NSMutableArray的分配上犯了一些错误,但作为一名iPhone新手,这一点并不明显。当我运行下面的代码时,我可以将对象MyObject添加到数组对象中,并设置名称等。NSLog显示正确的数据 但是当我试图从函数printObject访问objects_uu成员时,我得到了一个SIGABRT。看起来内存被释放了还是什么 谢谢你的帮助 @interface MyObject : NSObject { NSString

我在使用NSMutableArray时遇到了一些问题。我肯定我在NSMutableArray的分配上犯了一些错误,但作为一名iPhone新手,这一点并不明显。当我运行下面的代码时,我可以将对象MyObject添加到数组对象中,并设置名称等。NSLog显示正确的数据

但是当我试图从函数printObject访问objects_uu成员时,我得到了一个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]);
}

应该是:

 MyObject *obj = [[MyObject alloc] init];
在实现中添加合成

@implementation ObjectListViewController
@synthesize objects_;

我们可以消除MyObject上缺少init调用导致崩溃的原因,因为在本例中,它是良性的。启用init只会返回self,因此在本例中调用它不会改变行为。因此,我认为这里的前两个答案不会有任何区别:

对象只有在初始化后才能使用。NSObject类中定义的init方法不进行初始化;它只是返回自我

正确地指出init是中的一个基本步骤,您应该在分配MyObject时调用它

我也不确定第三个答案是否正确。我真的不明白在objects_uu数组上添加synthesis会有什么不同。您还没有将它定义为属性,我也不明白为什么需要这样做,因为它只是类的内部数据


关于这个问题的评论好吧,首先,您永远不会在@interface中定义printObject。from也不能真正帮助您,因为您必须在内部调用printObject,否则就不会发生崩溃

通读代码,我看不到明显的错误。initTableData完成后对象的保留计数应为1,MyObject实例的保留计数也应为1。所以我认为一定有其他代码在别处发布对象


我猜它是在objectAtIndex调用中崩溃的?控制台中有任何信息吗?调用堆栈是什么样子的?

下面是代码中的一些问题:

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

说了这么多,我看不出有什么会导致你的问题。可能是MyObject中名称的getter或setter不正确。请发布它们。

首先,您从未在@interface中定义printObject。这段代码看起来不错,所以您缺少问题代码。您确定正在调用
initTableData
?在调用
printObject
之前,是否还有其他任何东西可能接触到
对象?SIGABRT是不寻常的,尤其是在控制台中没有消息时。它不是一个坏的选择器,也不是一个空数组,这两个数组都会输出有用的调试信息。@quixoto:代码看起来不太好。“他从来都不知道这件事。”杰里米普:是的。以及你在回答中提到的所有其他要点。不过,这些都无法解开西格布特的神秘面纱当然,除非——我现在愿意打赌是这样——调试控制台中有一些有用的信息,OP没有与我们共享。好主意,但不是问题。是的,我必须同意init是不必要的+1因此,无论
init
在这种特殊情况下是否执行有用的函数,语言仍然需要它。你可能是对的,它不是这里的罪魁祸首,但说“你不需要调用
init
”(而且,这是一个注释,不是答案)仍然是错误的。So-1用于传播不准确信息@Chuck我想我已经用“尽管这是一个很好的实践,你可能想在你的MyObject init中做一些事情”澄清了这句话。我正在消除导致崩溃的原因是缺少init,我认为这是一个合理的解释。不过,我已采纳了这一点,我将努力澄清这一点。
    @interface ObjectListViewController : UITableViewController {
        NSMutableArray* objects_;
    }

   @property (nonatomic, retain) NSMutableArray *objects_;
   -(void) initTableData;
   -(void) printObject;

    @end
@implementation ObjectListViewController
@synthesize objects_;