управление памятью iPhone и Выпуск

Сделайте это с помощью jQuery:

jQuery('.classNameHere').text('text to be inserted');
6
задан Marc Charbonneau 5 May 2009 в 02:31
поделиться

6 ответов

Да, в этом коде есть проблемы. Он слишком рано выпускает 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];
}
-1
ответ дан 16 December 2019 в 21:45
поделиться

Основной ответ таков: в примере кода должен быть только один [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

0
ответ дан 16 December 2019 в 21:45
поделиться

Неверный выпуск в init.

Вы упомянули «обычную практику» и книгу без названия. Я предлагаю взглянуть на канонические примеры от Apple: ViewTransitions - хороший пример для этого случая (и 2 представления для загрузки;)

http://developer.apple.com/iphone/library/samplecode/ViewTransitions/index.html

0
ответ дан 16 December 2019 в 21:45
поделиться

Код неверен, вы не должны выпускать его в методе init, только когда вызывается dealloc (это если вы хотите сохранить его как ivar, вам не нужно если вам не нужен указатель на него в другом месте, так как addSubview: сохранит представление для вас).

Я считаю, что причина, по которой он на самом деле не сбой, заключается в том, что он все еще сохраняется в суперклассе (из вызова addSubview :), поэтому, когда он выпущен в режиме dealloc, который фактически сбалансирован. Представление, вероятно, удаляется из супервизора, когда оно сразу же освобождается, поэтому, когда вызывается [super dealloc] , оно не высвобождается. По крайней мере, это моя догадка.

0
ответ дан 16 December 2019 в 21:45
поделиться

Неверный код. В конечном итоге вы выпустите imgView после того, как он будет освобожден.

В вашем .m файле вы:

  1. alloc it -> он принадлежит вам
  2. добавьте его как subview -> вы и UIView владеете им
  3. выпускаете это -> вам не принадлежит

Затем в dealloc вы выпускаете imgView, хотя, как мы установили на шаге 3 выше, вы не являетесь его владельцем. Когда вы вызываете [super dealloc] , представление освобождает все свои подпредставления, и я полагаю, вы получите исключение.

Если вы хотите сохранить ivar imgView ], Я предлагаю не вызывать релиз после того, как вы добавляете его в качестве подпредставления, и оставлять свой dealloc прежним. Туда,

9
ответ дан 16 December 2019 в 21:45
поделиться

(У меня недостаточно репутации, чтобы добавить комментарий пока.)

@bentford: Поправьте меня, если я ошибаюсь, но я считаю, что для использования синтезированного сеттера свойства imgView вы должны использовать "self.imgView":

self.imgView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen]

Если у вас нет self. , он просто использует ivar и не получает дополнительного удержания.

0
ответ дан 16 December 2019 в 21:45
поделиться