Сделайте это с помощью jQuery:
jQuery('.classNameHere').text('text to be inserted');
Да, в этом коде есть проблемы. Он слишком рано выпускает imgView, что потенциально может вызвать сбои в редких случаях. сохраняет объект в переменной экземпляра, не сохраняя его, и обычно он просто неправильно управляет памятью.
Один правильный способ сделать это было бы так:
@interface SomeViewController : UIViewController
{
UIImageView *imgView;
}
@property (nonatomic, retain) UIImageView *imgView;
И в реализации;
@synthesize imgView;
Где-то в модуле:
//Create a new image view object and store it in a local variable (retain count 1)
UIImageView *newImgView = [[UIImageView alloc] initWithFrame:self.view.bounds];
newImgView.image = [UIImage imageNamed:@"someimage.png"];
//Use our property to store our new image view as an instance variable,
//if an old value of imgView exists, it will be released by generated method,
//and our newImgView gets retained (retain count 2)
self.imgView = newImgView;
//Release local variable, since the new UIImageView is safely stored in the
//imgView instance variable. (retain count 1)
[newImgView release];
//Add the new imgView to main view, it's retain count will be incremented,
//and the UIImageView will remain in memory until it is released by both the
//main view and this controller. (retain count 2)
[self.view addSubview:self.imgView];
И деаллок остается прежним:
- (void) dealloc
{
[imgView release];
[super dealloc];
}
Основной ответ таков: в примере кода должен быть только один [imgView release]
(, независимо от того, идет ли он после addSubview или в dealloc ). Тем не менее, я бы удалил [imgView release]
из dealloc
и оставил его после addSubview
.
В iPhone есть ловушка; с помощью didReceiveMemoryWarning
вы можете получить объекты (, включая весь вид ), выпущенные из-под вас. Если у вас есть набор сохранения для всего приложения, и вы не уважаете память, вы можете обнаружить, что приложение просто уничтожается.
Хороший пример:
если вы думаете о вложенном наборе из 3 представлений, выберите Вид 1-> Вид 2-> Вид 3.
Далее рассмотрим вызовы viewDidLoad
и viewDidUnload
. Если пользователь в настоящее время находится в «Представлении 3», возможно, что View1 выгружен, и это то, где это становится неприятным.
Если вы разместили объект внутри viewDidLoad
и не освободили его после добавления его в подпредставление, тогда ваш объект не будет освобожден, когда view1 выгружен, но view1 все еще выгружен.
viewDidLoad
снова запустится, и ваш код снова запустится, но теперь у вас есть два экземпляра вашего объекта вместо одного; один объект будет находиться в никуда с ранее выгруженным видом, а новый объект будет для текущего видимого вида. Промойте, вспените и повторите, и вы обнаружите, что ваше приложение вылетает из-за утечек памяти.
В этом примере, если данный блок кода является энергозависимым и имеет шанс быть выполненным снова ( из-за памяти или без нагрузки view ), я бы удалил [imgView release];
из dealloc и оставил бы его после addSubView.
http://www.otierney.net/objective-c.html#retain
Неверный выпуск в init.
Вы упомянули «обычную практику» и книгу без названия. Я предлагаю взглянуть на канонические примеры от Apple: ViewTransitions - хороший пример для этого случая (и 2 представления для загрузки;)
http://developer.apple.com/iphone/library/samplecode/ViewTransitions/index.html
Код неверен, вы не должны выпускать его в методе init, только когда вызывается dealloc (это если вы хотите сохранить его как ivar, вам не нужно если вам не нужен указатель на него в другом месте, так как addSubview: сохранит представление для вас).
Я считаю, что причина, по которой он на самом деле не сбой, заключается в том, что он все еще сохраняется в суперклассе (из вызова addSubview :), поэтому, когда он выпущен в режиме dealloc, который фактически сбалансирован. Представление, вероятно, удаляется из супервизора, когда оно сразу же освобождается, поэтому, когда вызывается [super dealloc]
, оно не высвобождается. По крайней мере, это моя догадка.
Неверный код. В конечном итоге вы выпустите imgView
после того, как он будет освобожден.
В вашем .m файле вы:
alloc
it -> он принадлежит вам выпускаете
это -> вам не принадлежит Затем в dealloc
вы выпускаете
imgView, хотя, как мы установили на шаге 3 выше, вы не являетесь его владельцем. Когда вы вызываете [super dealloc]
, представление освобождает все свои подпредставления, и я полагаю, вы получите исключение.
Если вы хотите сохранить ivar imgView
], Я предлагаю не вызывать релиз
после того, как вы добавляете его в качестве подпредставления, и оставлять свой dealloc
прежним. Туда,
(У меня недостаточно репутации, чтобы добавить комментарий пока.)
@bentford: Поправьте меня, если я ошибаюсь, но я считаю, что для использования синтезированного сеттера свойства imgView вы должны использовать "self.imgView":
self.imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]
Если у вас нет self. , он просто использует ivar и не получает дополнительного удержания.