0

在我的一种方法中,我获取并解析了 aJSON并将其放在一个NSArray名为 jsonArray in 的-(void)method1. 然后我将该 jsonArray 的内容复制到一个NSMutableArray名为copyedJsonArray 以用于其他方法。问题是,每当我从其他方法在控制台中记录其内容时,copyedJsonArray 就会崩溃,-(void)method2但它在-(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;
}

我这样做是为了在用户点击我的UISegmentedControl.

4

1 回答 1

0

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

使用属性

@interface
@property (retain) NSMutableArray* copiedJsonArray;
@end

然后要么

@synthesize copiedJsonArray = _copiedJsonArray

或将其保留(编译器将在 4.5 中自动将其放入)

访问为self.copiedJsonArray_copiedJSONArray
在 getter、setter、inits 和 deallocs 之外,使用self.表单,它更安全。

您也可以_copiedJsonArray在 setter 中懒惰地创建:

- (NSMutableArray*) copiedJsonArray
{
   if (!_copiedJasonArray)
         _copiedJsonArray = [NSMutableArray alloc] init;
   return _copiedJasonArray;
}
于 2013-01-13T12:16:29.193 回答