2010-09-12 2 views
0

Я новичок в ObC и имею проблему, которую я просто не могу исправить. Там могут быть и другие вопросы, как хорошо, но основной вопрос заключается в следующем:ObC: сбой приложений после возврата NSMutableArray?

  1. Запуск приложения
  2. Нажмите кнопку = загрузить новый вид
  3. В новом viewDidLoad я называю еще один объект/функцию и отправить NSMutableArray
  4. Данные процесса и отправьте обратно NSMutableArray
  5. Ошибка приложения, см. Комментарий где. Чаще всего, когда я возвращаюсь назад и обратно, но иногда в первый раз

Как я к этому отношусь, я думаю, я делаю много этого неправильно, но кто-то может взглянуть на код и дать мне несколько советов , Я бы предположил, что у меня проблема с выпуском чего-то.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSLog(@" "); 
    NSLog(@"viewDidLoad "); 
    NSLog(@" "); 
    NSLog(@">>Processing prepareGame<<"); 

    NSMutableArray *propArray1 = [[NSMutableArray alloc] initWithObjects:@"9999", nil]; //Init with dummy numbers 

    AccessPropertiesFile *readMyProperties = [AccessPropertiesFile new]; //Init function call to read file 

    NSLog(@"Prepare to call readProperties"); 

    propArray1 = [readMyProperties readPropertiesFile:propArray1]; 
    NSLog(@"Back from readProperties:error after this"); 
    /* 
    for (NSString *element in propArray1) { 
     NSLog(@"Elements in prop2Array; %@", element); 
    } 
    */ 
    [readMyProperties release]; 
    [propArray1 release]; 
} 



-(NSMutableArray *)readPropertiesFile:(NSMutableArray *)readDataArray { 

    NSLog(@"Processing readProperties"); 

    // For error information 
    NSError *error; 
    //Prepare File Manager 
    NSString *filePath = [self dataFilePath]; 
    NSFileManager *fileMgr; 
    fileMgr = [NSFileManager defaultManager]; 
    NSArray *propertiesArray = [NSArray alloc]; //Alloc array 

    //Check from what module the call is coming from to ecide what to do 
    if ([fileMgr fileExistsAtPath: filePath] == NO) { 
     NSLog (@"File not found"); 
     //File does not exists, this is the first time the game starts 
     //Set up default parameters 
     NSString *fileString [email protected]"0\n30\n30\n10\n1\n1\n1\n2\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n"; 
     // Write default parameters to file 
     [fileString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error]; 
     propertiesArray = [fileString componentsSeparatedByString:@"\n"]; // each line, adjust character for line endings 

    } 
    else {  //File exists 
     NSLog (@"File exists"); 
     NSString *fileString = [NSString stringWithContentsOfFile:filePath 
                 encoding:NSUTF8StringEncoding error:nil]; // reads file into memory as an NSString 
     propertiesArray = [fileString componentsSeparatedByString:@"\n"]; // each line, adjust character for line endings 

    } 

    //Clean readDataArray 
    [readDataArray removeAllObjects]; 

    //Populate return array 
    for (NSString *element in propertiesArray) { 
     //NSLog(@"Elements in propertiesArray; %@", element); 

     [readDataArray addObject:element]; 

    } 
    NSLog(@"readDataArray: %@", readDataArray); 


    [propertiesArray release]; 
    [readDataArray autorelease]; 

    NSLog(@"returning from readProperties"); 

    return readDataArray; 
} 

@end 

ответ

1

Вы более-рилизинг readDataArray (известный как propArray1 в методе, который не создавал его). Вы создаете его и автоматически проверяете его по второму методу, затем вы отпускаете его снова в конце вашего первого метода (где он не был создан).

+0

Спасибо, я забрал это в первом методе, с viewDidLoad, и он все еще прерывается во второй раз, когда я запускаю метод. Первый метод активируется, когда я перехожу в «newGame» view (viewDidLoad), затем обрабатываю, как описано выше, и когда это делается, я нажимаю кнопку «Назад» и возвращаюсь назад. Второй раз, когда я goto 'newGame', он ломается. – PeterK

+0

В этом коде есть ряд странностей, которые указывают на не очень хорошее понимание управления памятью. Например, ваша обработка readDataArray (и метода readPropertiesFile в целом) очень странная. Я рекомендую ознакомиться с документами по управлению памятью и переосмыслить ваш общий подход. –

0

Я предлагаю вам использовать функцию анализа, которая поставляется с последним XCode. Это хорошая функция, которую я всегда использую для отслеживания, если я забуду выпустить или выпустить слишком много.

Я также заметил, что вы также высвобождаете propertiesArray, потому что он содержит результат от [fileString componentsSeparatedByString:], который будет авторекламой согласно Конвенции Какао.

+0

БОЛЬШОЕ спасибо, кажется, это вызвало проблему с избыточным выпуском PropertyArray. В настоящее время выясняется, что моя проблема решена :-) – PeterK

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