问题
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