2013-01-13 2 views
0

В одном из моих методов я извлек и проанализировал JSON и разместил его внутри NSArray под названием jsonArray в -(void)method1. Затем я скопировал содержимое этого jsonArray в NSMutableArray с именем copiedJsonArray, который будет использоваться для других методов. Проблема в том, что copiedJsonArray сработает всякий раз, когда я регистрирую его содержимое в консоли из других методов -(void)method2, но он регистрируется в -(void)method1. Может ли кто-нибудь помочь мне в том, как это исправить?Ошибка чтения скопированного NSMutableArray на iPhone SDK

В моем файле заголовка:

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

Я делаю это так, чтобы я мог сделать цикл в моем copiedJsonArray, не получая его содержимое из JSON снова и снова, когда пользователь нажимает на мой UISegmentedControl. Любая помощь будет оценена по достоинству. Заранее спасибо.

+0

[Вы используете ARC или нет?] (Http://stackoverflow.com/questions/10508228/how-to-know-if- my-xcode-iphone-project-is-using-arc) Также опубликуйте свой реальный код; вышеупомянутый 'method1' не будет работать, потому что' jsonDictonary' (sic) не был объявлен. –

+0

Я не использую ARC. Будет ли редактировать мой пост с кодом для jsonDictionary, если это поможет. – jaytrixz

+0

Опубликовать полную консольную ошибку. Msg. Не экстрасенс! – occulus

ответ

0

Если вы вызываете метод2 перед методом1, он будет аварийно завершен, поскольку скопированJasonArray не был создан. Вы не должны создавать переменные экземпляра внутри методов (поскольку вы не можете знать, были ли они вызваны). Вы должны сделать это, когда создаете свой viewController, например, в viewDidLoad.

И use properties:

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

затем либо

@synthesize copiedJsonArray = _copiedJsonArray 

или оставить эту линию его (компилятор поместит его автоматически в 4.5)

доступ как self.copiedJsonArray или _copiedJSONArray.
За пределами геттеров, сеттеров, inits и deallocs используйте форму self., это безопаснее.

Вы также можете создать _copiedJsonArray лениво сеттер:

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

Я уже делал это, но все же, такая же ошибка происходит. @property (сохранить) NSMutableArray * copiedJsonArray; и синтезировал его и получил доступ к нему через self.copiedJsonArray. Я просто поместил имя - (void) method1 в качестве примера, но они не являются реальными именами методов, которые я использую. Кроме того, сначала вызывается m- (void) emthod1. – jaytrixz

+0

где вы сейчас создаете свой массив? – foundry

+0

Можете ли вы NSLog, как только он будет создан?Затем NSLog это снова из нескольких точек в вашей программе, чтобы определить, будет ли он ТОЛЬКО сбой в методе2 или в других местах. Он ТОЛЬКО сбой после того, как метод1 запущен, а не раньше, например? Получите больше информации ... Какую информацию о сбоях вы попадаете в журнал? – foundry

Смежные вопросы