NSMutableArrays不将其对象保存在共享实例中

时间:2013-04-10 23:39:43

标签: iphone ios objective-c

我有一个sharedInstance,它由许多NSMutableArrays组成,它保存我的应用程序中遍布许多视图的所有表单数据。

他们在.h中声明的例子看起来像是

@property (atomic, retain) NSMutableArray *i_date;
@property (atomic, retain) NSMutableArray *i_tailNumber;
@property (atomic, retain) NSMutableArray *i_pic;
@property (atomic, retain) NSMutableArray *i_sic;

和.m( - init)

self = [super init];

_i_date = [NSMutableArray array];
_i_tailNumber = [NSMutableArray array];
_i_pic = [NSMutableArray array];
_i_sic = [NSMutableArray array];

共享实例功能

+(id) sharedInstance
{    
    static id sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[self alloc] init];        
    }
    return sharedInstance;
}

编辑:

我在第一个视图上实例化所有带有空字符串的数组,如下所示

[_fd.i_date addObject:@""];
[_fd.i_tailNumber addObject:@""];

最后,我在准备segue函数时以这种方式与我的数据交互

[_fd.i_date replaceObjectAtIndex:leg withObject:transferDate];
rinse and repeate

我的问题,我今天花了很多时间通过阅读各种博客,文档以及SO的所有精彩资源进行调查,就是当我转向另一个视图时,我的数组会丢失我放在其中的任何对象。

当我点击上面的代码行时,我得到了经典的

signal SIGABRT

错误,它抱怨我的数组是空的(0个对象),所以它不能替换任何东西。

我怀疑我没有正确处理我的共享实例,而且...也许,我的数组的多个实例正在被分配,但我确信我已经理解了。

任何想法发生了什么?我想我提供了所有必要的代码片段,但如果我忘记了什么,只要问一下。再次感谢!

杰西


修改  你们快点! :D我在启用ARC的情况下创建了我的OBJ-C文件,所以我想我正在使用它。我是一个C ++人,大多数情况下这个可选的手拿着内存对我来说本身很模糊。


修改 完整的错误是

2013-04-10 20:25:03.239 ProjectName[4230:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM replaceObjectAtIndex:withObject:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(0x1caf012 0x10ece7e 0x1c65ba9 0x7c7e 0x478b87 0x478c14 0x1100705 0x342c0 0x270a64 0x1100705 0x342c0 0x34258 0xf5021 0xf557f 0xf46e8 0x63cef 0x63f02 0x41d4a 0x33698 0x1c0adf9 0x1c0aad0 0x1c24bf5 0x1c24962 0x1c55bb6 0x1c54f44 0x1c54e1b 0x1c097e3 0x1c09668 0x30ffc 0x222d 0x2155)
libc++abi.dylib: terminate called throwing an exception

4 个答案:

答案 0 :(得分:1)

假设您没有使用ARC,则init方法使用的是内存管理不善。由于您要直接访问ivars(而不是属性),因此需要保留数组:

_i_date = [[NSMutableArray alloc] init];
_i_tailNumber = [[NSMutableArray alloc] init];
_i_pic = [[NSMutableArray alloc] init];
_i_sic = [[NSMutableArray alloc] init];

答案 1 :(得分:1)

您没有使用这些属性,但是您创建了自动释放的对象。

使用

之类的属性
+(id) sharedInstance
{    
    static id sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[self alloc] init];   

         sharedInstance.i_date = [NSMutableArray array];
         sharedInstance.i_tailNumber = [NSMutableArray array];
         sharedInstance.i_pic = [NSMutableArray array];
         sharedInstance.i_sic = [NSMutableArray array];     
    }
    return sharedInstance;
}

或按照rmaddy的建议行事。


[_fd.i_date replaceObjectAtIndex:leg withObject:transferDate];

此行崩溃,因为数组还有一个索引为leg

的对象

尝试

[_fd.i_date addObject:transferDate];

答案 2 :(得分:0)

您应该分配并初始化NSMutableArray s:

_i_date = [[NSMutableArray alloc] init];

然后使用你的单身类,即:

[[_fd sharedInstance] i_date] addObject...]

答案 3 :(得分:0)

不知道的是,我使用了函数“didMoveToParentViewController”,如果它被视图重载和使用,则会在显示新视图后调用它。在其中,我正在清除所有数组,认为只有在将BACK移动到父视图时才会被调用,因为单词“did”是过去时单词。由于情况并非如此,我在页面加载后立即清理了数组,这导致了segue期间的空数组。