EXC_BAD_ACCESS, когда не использует self - PullRequest
0 голосов
/ 25 марта 2010

Я снова получил ошибку и хотел бы уточнить, почему это ошибка.

У меня есть простой UITableView, который загружает некоторые данные:

// myclass.h
@property (nonatomic, retain) NSArray *myData

// myclass.m
@synthesize myData;

- (void) viewDidLoad {
  ...
  myData = someDataSource // note the lack of self
}

- (UITableViewCell *) cellForRowAtIndexPath ... {
   ...
   cell.textLabel.text = [self.myData objectAtIndex:indexPath.row];  // EXC_BAD_ACCESS
}

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

Я что-то упустил в отношении @property retain. Насколько я понимаю, он освобождает все, на что указатель указывал до переназначения. Если я прав, то почему бы не использовать себя. вызвать какие-либо проблемы?

Спасибо за помощь.

**** Обновление

Почему это во всех примерах, которые я проверял, для освобождения объектов в методе dealloc без self?

- (void) dealloc { 
  [someArray release]; 
  [someTableView release];
}

Ответы [ 2 ]

1 голос
/ 25 марта 2010

В случае

myData = someDataSource;

вы даете ссылку someDataSource (локальная переменная или переменная ограниченной области видимости) на myData. Теперь, как только someDataSource выходит из области видимости, он освобождается, а когда вы передали ссылку на myData, он также выпускается.

теперь в случае

self.myData = someDataSource;

значение someDataSource присвоено myData. Следовательно, все, что случится с someDataSource myData, сохранит значение.

Вы можете сделать это иначе:

myData = [someDataSource retain];

Надеюсь, это поможет.

Спасибо

Madhup

1 голос
/ 25 марта 2010

Если вы не используете self., вы напрямую присваиваете переменной экземпляра myData, которая не имеет ничего общего со свойством myData.

self.myData - это просто синтаксический сахар для [self myData] или [self setMyData:newValue], а синтезированное свойство просто создает методы -myData и -setMyData:.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...