Error Reading Copied NSMutableArray on iPhone SDK

梦想与她 提交于 2019-12-11 14:34:36

问题


In one of my methods, I fetched and parsed a JSON and placed it inside an NSArray called jsonArray in -(void)method1. I then copied the contents of that jsonArray to an NSMutableArray called copiedJsonArray to be used on other methods. Problem is, copiedJsonArray crashes whenever I log its contents in the console from the other methods -(void)method2 but it logs fine in -(void)method1.

How can I fix this?

In my header file:

@interface MainViewController : UIViewController

@property (nonatomic, retain) NSMutableArray *copiedJsonArray;

In my implementation file:

@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);
}

I also tried doing this too but it does the same error:

copiedJsonArray = [jsonArray mutableCopy];

I also tried implementing NSCopy but fails too:

@interface MainViewController : UIViewController <NSCopying>
{
    NSMutableArray *copiedJsonArray;
}

I'm doing this so that I can do a loop in my copiedJsonArray without fetching its contents from JSON again and again when the user taps on my UISegmentedControl.


回答1:


If you call method2 before method1 it will crash as copiedJasonArray has not been created. You should not create instance variables inside methods (as you cannot know if they have been called). You should do it when you create your viewController, in viewDidLoad for example.

And use properties:

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

then either

@synthesize copiedJsonArray = _copiedJsonArray

or leave that line it out (the compiler will put it in automatically in 4.5)

access as self.copiedJsonArray or _copiedJSONArray.
Outside of getters,setters,inits and deallocs, use the self. form, it's safer.

You could also create _copiedJsonArray lazily in the setter:

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


来源:https://stackoverflow.com/questions/14301364/error-reading-copied-nsmutablearray-on-iphone-sdk

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!