读取iPhone SDK上复制的NSMutableArray时出错

读取iPhone SDK上复制的NSMutableArray时出错,iphone,xcode,nsmutablearray,copy,Iphone,Xcode,Nsmutablearray,Copy,在我的一个方法中,我获取并解析了一个JSON,并将其放在-(void)method1中名为jsonArray的NSArray中。然后,我将该jsonArray的内容复制到名为copiedJsonArray的NSMutableArray中,以用于其他方法。问题是,每当我从其他方法-(void)method2在控制台中记录其内容时,copiedJsonArray就会崩溃,但它在-(void)method1中记录良好 我怎样才能解决这个问题 在我的头文件中: @interface MainViewCo

在我的一个方法中,我获取并解析了一个
JSON
,并将其放在
-(void)method1
中名为jsonArray的
NSArray
中。然后,我将该jsonArray的内容复制到名为copiedJsonArray的
NSMutableArray
中,以用于其他方法。问题是,每当我从其他方法
-(void)method2
在控制台中记录其内容时,copiedJsonArray就会崩溃,但它在
-(void)method1
中记录良好

我怎样才能解决这个问题

在我的头文件中:

@interface MainViewController : UIViewController

@property (nonatomic, retain) NSMutableArray *copiedJsonArray;
在我的实现文件中:

@synthesize copiedJsonArray;

- (void)viewDidLoad
{
    [self method1];
}

- (void)method1
{
    NSString *urlString = [NSString stringWithFormat:THE_URL]; 
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSString *jsonString = [[[NSString alloc] initWithData:data
                                              encoding:NSUTF8StringEncoding] autorelease];
    NSDictionary *jsonDictonary = [jsonString JSONValue];
    NSArray *jsonArray = [jsonDictonary valueForKeyPath:@"QUERY.DATA"];

    self.copiedJsonArray = [[NSMutableArray alloc] initWithArray:jsonArray copyItems:YES];

    NSLog(@"Copied JSON Array in Method 1: %@", self.copiedJsonArray);

    [self method2];
}

- (void)method2
{
    NSLog(@"Copied JSON Array in Method 2: %@", self.copiedJsonArray);
}
我也尝试过这样做,但也会出现同样的错误:

copiedJsonArray = [jsonArray mutableCopy];
我还尝试实现了
NSCopy
,但也失败了:

@interface MainViewController : UIViewController <NSCopying>
{
    NSMutableArray *copiedJsonArray;
}
@interface MainViewController:UIViewController
{
NSMutableArray*复制的JSONArray;
}

我这样做是为了当用户点击我的
UISegmentedControl
时,我可以在copiedJsonArray中执行循环,而不必一次又一次地从JSON获取其内容

如果在method1之前调用method2,它将崩溃,因为尚未创建copiedJasonArray。您不应该在方法内部创建实例变量(因为您无法知道它们是否已被调用)。您应该在创建viewController时执行此操作,例如在viewDidLoad中

以及:

那么

@synthesize copiedJsonArray = _copiedJsonArray
或者将该行保留(编译器将在4.5中自动将其放入)

self.copiedJsonArray
\u copiedJsonArray

在getter、setter、init和dealloc之外,使用
self.
表单更安全

您还可以在setter中惰性地创建
\u copiedJsonArray

- (NSMutableArray*) copiedJsonArray
{
   if (!_copiedJasonArray)
         _copiedJsonArray = [NSMutableArray alloc] init;
   return _copiedJasonArray;
}

此外,张贴你的真实代码;上面的
方法1
不起作用,因为
jsondictional
(sic)尚未声明。我没有使用ARC。如果有帮助的话,我将用JSONDICTIONAL的代码编辑我的帖子。发布完整的控制台错误消息。我不是通灵者!0x18b709f:movl(%edi),%esi-线程1:EXC_BAD_访问(代码=2,地址=0x0),而我的控制台上只有copiedJsonArray:(null)和(lldb)。这(null)是我检查数组是否有值的日志。我已经这样做了,但仍然会发生相同的错误@属性(保留)NSMUTABLEARRY*复制JSONARRAY;合成并通过self.copiedJsonArray访问它。我只是以名称-(void)method1为例,但它们不是我使用的真实方法名称。另外,首先调用m-(void)emthod1。您现在在哪里创建阵列?您能在创建阵列后立即记录它吗?然后从程序中的多个点再次记录它,以确定它是仅在method2中崩溃,还是在其他地方也崩溃。例如,它是否仅在method1运行之后崩溃,而不是之前崩溃?获取更多信息。。。你在日志中得到了什么崩溃信息?请参阅我上面编辑的帖子。我从method1获取的日志不会返回null,而从method2获取的日志会返回null,从而导致崩溃。但是为了清楚起见,根据我的回答,您能否区分您的iVar和您的财产名称,并始终通过其财产(即
self.copiedJSONArray
)对iVar进行寻址。只是为了确保在这两种情况下都能访问iVar。同时将alloc/init方法移动到viewDidLoad中,以确保只调用它一次。然后在viewDidLoad中创建后记录它,在method1的开始和结束处再次记录它。。。所有这些都无法修复您的错误,但可能会使查找问题变得更容易。
- (NSMutableArray*) copiedJsonArray
{
   if (!_copiedJasonArray)
         _copiedJsonArray = [NSMutableArray alloc] init;
   return _copiedJasonArray;
}