2011-12-14 2 views
2

У меня есть странная проблема. pictureLink является глобальной переменной, объявленной в .hполучить значение переменной NSString

NSString *pictureLink; 
} 
@property(retain,nonatomic) NSString *pictureLink; 

я написал этот код

NSString * myPictureUrl=[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; 
pictureLink=myPictureUrl; 

У меня есть странный результат, он должен быть указателем Или

pictureLink=[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; 

я есть Ошибка EXC_BAD_ACESS

+0

Если возможно, используйте ARC, тогда компилятор будет обрабатывать все показатели сохранения за кулисами. – zaph

ответ

6

Это ошибка управления памятью, y ou're не сохраняет myPictureUrl в вашем коде.

[NSString stringWithFormat:@"http://mywebsite.com/uploads/%@.jpg",hash]; возвращает autoreleased значение, поэтому у вас есть два варианта:

  1. pictureLink=myPictureUrl; должен выглядеть как [self setPictureLink:myPictureUrl];.
  2. сделать [myPictureUrl retain];, и не забудьте до release позже.

Рассмотрите возможность использования ARC (Automatic Retain Counting) для вас проекта. С ARC компилятор позаботится о сохранении счета, поэтому вам не нужно, на самом деле не разрешено. Существует рефакторинг, который преобразует текущий проект.

+1

Если свойство не содержит кода вокруг него, используйте средства настройки/getters. Присвоение непосредственно 'pictureLink' создаст утечку памяти объекта, на который в данный момент указывает« pictureLink ». – zaph

+0

@Andrey спасибо работа безупречный. Это мое первое приложение, и я никогда не выпускаю объект: D это вызовет у меня проблемы? – user567

+0

@Mehdi: конечно, вам нужно освободить все ваши свойства 'keep' /' strong' ivars в методе '- (void) dealloc'. –

2

Вы обходите свой @property, вызывая непосредственно переменную, поэтому magic, предоставленный вашими настройками @property, выполняется, как сохранение и выпуск.
вам необходимо сделать self.pictureLink, чтобы использовать @property.
Чтобы избежать соблазна доступа непосредственно к моей переменной я следующее

NSString *theProperty 
} 
@property (nonatomic, retain) NSString *property; 

и

@synthesise property = theProperty; 

Таким образом, если я иду вокруг @property я действительно, действительно хотел сделать это.
Но для этого вам нужна очень, очень, очень веская причина, и тогда это событие может быть недостаточно.

+1

@VinceBum Также, напрямую назначая ivar, релиз не выполняется на любом предыдущем объекте, на который он указал. – zaph

+0

@CocoaFu, да в обход '@ property' плохо. –

+0

Другим символом подчеркивания «_» используется вместо «the». Пример: '@synthesize property = _property;'. Но 'theProperty' отлично работает. – zaph

Смежные вопросы