большая проблема с памятью в объективе c - PullRequest
1 голос
/ 06 мая 2011

У меня есть такая функция:

@property(nonatomic,retain) NSMutableArray *array;

@synthesize array = _array;

(NSMutableArray *) name
{
   self.array = [[NSMutableArray alloc]init];

   [_array addObject:object];
   [object release];
   return [_array autorelase];
}

В другой функции у меня есть свойство, подобное указанному выше свойству, именованный результат, и я делаю:

self.result = [... name];

Затем в dealloc я делаю

[_result release];

, и в этот момент происходит сбой, как я могу решить эту проблему?Я перепробовал много дорог, но или он падает, или я вижу утечку памяти в приборах, где я ошибаюсь?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Несмотря на то, что в этом коде много ошибок, вероятной причиной вашего сбоя является то, что вы выпускаете object в пределах -name, не вступая во владение им - если вы не создаете object в методе посредством вызовадля -alloc, -new или -copy этот метод не владеет им и не отвечает за его освобождение.Это приводит к тому, что этот объект является недействительным в NSMutableArray, поэтому, когда _result освобождает, он пытается освободить недопустимый кусок памяти и вылетает.

Кроме того, свойства не являются просто локальными переменными для отдельных функций, они 'Переменные-члены для экземпляров класса, для которого вы пишете эти классы.Если ваша конечная цель состоит только в том, чтобы вернуть автоматически освобожденный массив и установить его в результате, вы можете сделать следующее:

- (NSMutableArray *) name {
  //call a convenience method- it comes back autoreleased
  NSMutableArray* theArray = [NSMutableArray array];
  [theArray addObject:object];
  //don't release object unless you took ownership of it in this function
  return theArray;
}

, а затем за пределами функции либо вызвать self.result = [... name], либо [self setResult:[... name]];

0 голосов
/ 06 мая 2011

У вас очень странное определение метода (заголовок должен иметь - перед возвращаемым типом), и внутри этого определения вы получаете доступ к переменной с именем object, которая, кажется, не существует. Я не уверен, что вы хотите, но у вас есть по крайней мере одна проблема с памятью. Массив, который вы создаете в name, пропускается при каждом вызове метода. Если вы добавите некоторые детали, например, сообщение об ошибке, кто-то может помочь больше.

...