Потенциальная утечка объекта, расположенного в строке ## - PullRequest
1 голос
/ 16 января 2012

Я работаю над приложением для iphone, и, хотя мне показалось, что я хорошо разбираюсь в управлении памятью, после использования функции Xcode Analyze у меня возникают некоторые проблемы.Я рассмотрел многие из существующих вопросов, которые мог найти здесь, но я не смог найти тот, который был похож на мою ситуацию.

CustomerDetailController.h

@interface CustomerDetailController : UITableViewController {
  PTCustomer *customer;
}
@property (nonatomic, retain) PTCustomer *customer;

- (id)initWithCustomer:(PTCustomer *)aCustomer;

CustomerDetailController.m

@synthesize customer;

- (id)initWithCustomer:(PTCustomer *)aCustomer {
  if ((self = [super initWithStyle:UITableViewStyleGrouped]))
  {
    if (aCustomer != nil)
      self.customer = aCustomer;
    else
      self.customer = [[PTCustomer alloc] init];  // This line shows Potential leak of an object allocated on line ##

  }
  return self;
}

Если я нажимаю на элемент, помеченный анализатором, он говорит:

  1. Метод возвращает объект Objective-C с счетом удержания +1

  2. Объект просочился: выделенный объект не упоминается позже в этом пути выполнения и имеет счет сохранения + 1

Я пришел к выводу, чтоесли объект PTCustomer не был передан, я хочу инициализировать новый, чтобы он был доступен в другом месте этого класса.

Как правильно это сделать?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 января 2012

self.customer перерасходуется.
+1 для выделения клиента
+1, когда установщик свойства сохраняет клиента.

Не сохраняйте customer, установщик свойств сохранит его.

Just:

self.customer = [[[PTCustomer alloc] init] autorelease];

Но, учитывая, что это метод init, существует веский аргументчто ивар должен быть назначен напрямую:

customer = [[PTCustomer alloc] init];
1 голос
/ 16 января 2012

Другой вариант - назначить сохраненный объект непосредственно customer, а не self.customer. Это обходит логику автоматического сохранения в методе setCustomer. Однако, если вы это сделаете, вы должны убедиться, что любой предыдущий объект, на который ссылается customer, освобождается (например, присваивая nil значение self.customer).

(Так как обход установщика таким способом является несколько нерегулярной техникой, некоторые люди недовольны этим.)

0 голосов
/ 16 января 2012

Вы выпускаете свой customer ивар в розыгрыш? Если нет, то это ваша утечка.

...