2014-09-12 2 views
-1

У меня есть NSmutable массив, и я добавляю в него некоторые строки, присутствующие в массиве C. При использовании этого методаДобавление объектов в NSmutableArray из массива C

if (!self.arrayOfVariableNames) { 
     self.arrayOfVariableNames = [[NSMutableArray alloc] init]; 
     for (int i = 0; i< cols; i++) { 
      [self.arrayOfVariableNames addObject:[NSString stringWithCString:cArrayOfVariableNames[i] encoding:NSUTF8StringEncoding ]]; 
     } 
    } 
    else{ 
     [self.arrayOfVariableNames removeAllObjects]; 
     for (int i = 0; i< cols; i++) { 
     [self.arrayOfVariableNames addObject:[NSString stringWithCString:cArrayOfVariableNames[i] encoding:NSUTF8StringEncoding ]]; 
     } 
    } 

Обеспечивает ли этот метод, что объекты в NSMutableArray не будут высвобождены, когда массив C берется из памяти?

+0

ДА .. Вы столкнулись с какими-либо проблемами? – croyneaus4u

+0

На самом деле много проблем. Я программист на самообучении, и я почти готов сдаться, поскольку не могу понять некоторые вещи. Я должен использовать этот массив в представлении таблицы, но к тому времени, когда реализованы методы источника данных tableview, этот массив станет нулевым. – Morpheus

+0

Если ваш NSArray становится нулевым, вы не будете ссылаться на него. Сделайте это свойством вашего контроллера. – uchuugaka

ответ

1

, если этот массив arrayOfVariableNames становится Null, тогда проблема заключается в инициализации массива. Пожалуйста, попробуйте использовать отложенную загрузку, делая это:

- (NSArray*)arrayOfVariableNames { 
    if (!_arrayOfVariableNames) { 
     _arrayOfVariableNames = [[NSMutableArray alloc] init]; //initialise the array if needed 
    } 
    return _arrayOfVariableNames; //else return the already initialized array 
} 

и, пожалуйста, закомментируйте эту строку в коде: self.arrayOfVariableNames = [[NSMutableArray alloc] init];

**** EDIT ****
Пожалуйста, найдите код обновления в https://docs.google.com/file/d/0BybTW7Dwp2_vdHhQN1p1UzExdTA/edit?pli=1. Посмотри на это.

+0

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

+0

Конечно, я могу .. передать мне ссылку. – croyneaus4u

+0

Вот ссылка на Dropbox. Пожалуйста, прочитайте README. https://www.dropbox.com/s/nn3qc1irb1ody85/Solver.zip?dl=0 – Morpheus

0

Да. NSArray сохраняет что-то в нем. Но вы должны прекратить цепочку создания NSString и вместо этого создать строку строки, прежде чем добавлять ее в массив. Затем проверьте нуль. Добавляйте его только к массиву, если он не равен нулю. Защитный код.

+0

Копия NSStrings в данных из C-строк поэтому они не будут изменены, когда C-строки будут освобождены, и NSArray сохранит копии NSStrings, чтобы NSStrings не были выпущены. – MtRoad

+0

Дело в том, что вы не можете гарантировать, что вы получите NSString с строка C. Это может потерпеть неудачу по многим причинам. Вы не можете добавить nil в NSArray или NSMutableArray. – uchuugaka

+0

Я не видел [строка, возвращающаяся с нулем] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html # // apple_ref/occ/clm/NSString/stringWithCString: кодирование :) в документах, но вы делаете действительно хорошую точку , Я пытался уточнить, что C-строки копируются в NSStrings и, следовательно, сохраняются после освобождения C-строк. – MtRoad

0

arrayOfVariableNames не изменится, когда массив C будет освобожден.

Убедитесь, что переменная arrayOfVariableNames: strong.

@property (nonatomic, strong) NSMutableArray *arrayOfVariableNames; 

    if (!self.arrayOfVariableNames) 
    { 
     self.arrayOfVariableNames = [[NSMutableArray alloc] init]; 
    } 
    else 
    { 
     [self.arrayOfVariableNames removeAllObjects]; 
    } 

    for (int i = 0; i< cols; i++) 
    { 
     NSString *tempString = [NSString stringWithCString:cArrayOfVariableNames[i] encoding:NSUTF8StringEncoding]; 

     if([tempString length] > 0) 
     { 
     [self.arrayOfVariableNames addObject:tempString]; 
     } 
     else 
     { 
     NSLog(@"string is empty"); 
     } 
    } 
Смежные вопросы