在将引用传递给第一个视图控制器时,看起来第二个数组已经被释放,或者第一个视图控制器本身已经被取消。如果第一个是正确的,那么您可能需要一个不同的模型对象来保存您的数据,而不是将其保存在应用程序的控制器层中。如果不是这种情况,那么您可能需要考虑直接复制。最简单的方法是在接口文件中将 firstArray 属性声明为关键字 copy 而不是 strong 。
如果您确实需要在应用程序的模型层中保留数据,那么正如 EXEC_BAD_ACCESS(好名字!)指出的那样,单例模式对象确实是实现此目的的一种方式。编写单例的一种稍微更现代(虽然功能等效)的方式如下。
@interface MySingleton : NSObject
@property (strong, readwrite) id myData;
+ (id)sharedSingleton
@end
@implementation MySingleton
+ (id)sharedSingleton
{
static MySingleton *singleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singleton = [[MySingleton alloc] init];
// Do other setup code here.
});
return singleton;
}
@end
请注意 dispatch_once 的使用 - 这确保静态单例只能创建一次(而从技术上讲,您可以手动调用 +[NSObject initialize] 多次,尽管我从不建议这样做)。