Могу ли я использовать одну переменную экземпляра, чтобы указывать на разные объекты в течение срока ее службы? - PullRequest
0 голосов
/ 26 апреля 2011

У меня простой вопрос об использовании указателя в Obj-C.

Разве это плохая практика - использовать один указатель для разных экземпляров одного и того же?

в MovieTheater.h:

@interface MovieTheater : UIViewController {
    Poster *newMoviePoster;

}

@property (nonatomic, retain) Poster *newMoviePoster;

- (void) changePoster:(NSString*)titleText;

Затем в MovieTheater.m:

@synthesize newMoviePoster;


- (void)viewDidLoad
{
   [super viewDidLoad];
  newMoviePoster = [[Poster alloc]initWithTitle:@"COMING IN MAY"];



}

-(void) changePoster:(NSString*)titleText{

    newMoviePoster= [[Poster alloc]initWithTitle:titleText];

}


- (void)viewDidUnload
{
[newMoviePoster release];
}

Давайте предположим, что нам нужно часто обращаться к объекту newMoviePoster, поэтому его нужно освободитьдо того, как viewDidUnload ломает приложение.

Это законный код?Это выглядит хорошо для меня, но я относительно новичок в Obj-C.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Ваш код неверный, это утечка памяти.Когда вы создаете новый объект с помощью вызова alloc, вы получаете указатель на выделенную память, которая вам понадобится позже release.Вы сохраняете это значение в переменной newMoviePoster - пока все хорошо.Но когда вы вызываете changePoster:, вы перезаписываете предыдущий указатель новым.Старый указатель на выделенную память исчез, и вы не сможете освободить память, она будет потеряна, пока ваша программа не закроется.

Это легко исправить, но что действительно нужно исправить, так это ваше понимание памяти Какаоуправление.Вы можете начать с чтения Руководства по управлению памятью Какао , которое необходимо прочитать любому программисту Какао.

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

2 голосов
/ 26 апреля 2011

Это прекрасно, , за исключением , который необходим для освобождения старого экземпляра newMoviePoster перед назначением нового:

-(void) changePoster:(NSString*)titleText{
    [newMoviePoster release]
    newMoviePoster= [[Poster alloc]initWithTitle:titleText];
}

Или используйте синтезированный сеттер:

self.newMoviePoster = [[[Poster alloc] initWithTitle:titleText] autorelease];
1 голос
/ 26 апреля 2011

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

Найти источник ошибки может быть почти невозможно.

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