我在使用 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正确指出 init 是 object 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/