NSArray случайным образом превращается в разные вещи! - PullRequest
0 голосов
/ 10 августа 2010

Мне кажется, у меня проблема с управлением памятью.Мой NSArray (называемый arr) превращается в разные вещи в случайные моменты времени.Понятия не имею почему.У меня есть файл .h, который объявляет массив, а затем я инициализирую массив, используя

NSString *input = [[NSString alloc] initWithData:myData encoding:NSACIIStringEncoding];
arr = [input componentsSeperatedByString:@"\n"];

, а затем я использую его во всей программе, и вдруг он меняется на разные вещи (например, UITouch, иногда).Я никогда не называл релиз на этом.Почему он это делает?Как предотвратить случайное изменение объектов из-за проблем с памятью?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Что происходит, так это то, что память, однажды занятая вашим NSArray, занята другим объектом.Это может быть любой объект, и поскольку вы много касаетесь экрана, UITouch очень распространен.

Это означает, что вы не сохраняете NSArray, когда это необходимо, поэтому он освобождается преждевременно.Вы не показываете код, объявляющий arr, но если вы объявляете arr как

@property (nonatomic,retain) NSArray *arr;

и синтезируете его, используя

@synthesize arr;

, то сохранение обрабатывается простым присвоением self.arr вместо arr:

self.arr = [input componentsSeperatedByString:@"\n"];

В языке какао ваш объект теперь "владеет" массивом.В методе dealloc этого класса вы должны [self.arr release].

Если вы назначите какой-либо другой массив для self.arr, объект, назначенный self.arr, ранее будет освобожден, а новый сохранен..

0 голосов
/ 10 августа 2010

Или инициализируйте новый массив с этим массивом:

arr = [[NSArray alloc] initWithArray:input];
0 голосов
/ 10 августа 2010

Попробуйте сохранить обр. .

arr = [[input componentsSeperatedByString:@"\n"] retain];
...