gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:43 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com