iphone - 访问 NSMutableArray 成员变量时崩溃

标签 iphone objective-c

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

最佳答案

我们可以消除 MyObject 上缺少 init 调用作为崩溃的原因,因为在这种情况下它是良性的。在 NSObject 上调用 init只会返回自己,所以在这种情况下调用它不会改变行为。所以我认为这里的前两个答案不会有任何不同:

An object isn’t ready to be used until it has been initialized. The init method defined in the NSObject class does no initialization; it simply returns self.

Chuck正确指出 initobject allocation and initialization 中的基本步骤并且您应该在分配 MyObject 时调用它。

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

问题的评论好吧,对于初学者来说,您永远不会在@interface 中定义printObject。 来自eykanal也没有真正帮助你,因为你必须在内部调用 printObject ,否则你不会遇到崩溃。

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

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

关于iphone - 访问 NSMutableArray 成员变量时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655332/

相关文章:

iphone - 为iPhone游戏创建声音

ios - 推送在导航 Controller ( Storyboard)中不起作用

objective-c - 了解 Cocoa Drawing 中的点和用户空间,因为它们与屏幕分辨率交互

objective-c - 有没有办法忽略 objective-c 中的 uitouch?

ios - 如何阻止 Storyboard 剧集

iphone - NIB 文件中的子类 UIView 未键入子类

iphone - UIActivityIndi​​cator 流程执行后开始循环

iphone - 我们的淡入淡出动画卡住了按钮和 slider 控件

iphone - 如何将导航 Controller 添加到翻转 View ?

ios - iPhone 上通用 Storyboard的限制