2012-04-02 2 views
0

В моем приложении для iPhone/iPad,Как освободить подпункты

Я добавляю один подъярус к моему основному виду.

Этот подъярус имеет одно изображение и кнопку.

Когда их выпускать?

Мой код находится здесь,

customAlertView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 600, 600)]; 


     UIImageView *imgv=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"celebration.png"]]; 

      UIButton *btnOK=[UIButton buttonWithType:UIButtonTypeCustom]; 

     [btnOK setTitle:@"OK" forState:UIControlStateNormal]; 
     [btnOK addTarget:self action:@selector(alertOKClicked) forControlEvents:UIControlEventTouchUpInside]; 

     [customAlertView addSubview:btnOK]; 
     [customAlertView addSubview:imgv]; 
     [self.view addSubview:customAlertView]; 

     [imgv release]; 
     [btnOK release]; 



In one another method I am writing the code. 

    [customAlertView removeFromSuperview]; 

Моя путаница ImageView и кнопка есть Если

  1. я выпускаю customalertview здесь будет автоматически освобождает его подвидов. Если да, то проблем нет.
  2. Если НЕТ, как выпустить его

    как я сделал здесь выпустили объекты, сразу после добавления подвидов. Это приведет к тому, что моя кнопка ОК недопустима. И не будет влиять на нажатие кнопки.

    Итак, при удалении из супервизора я должен писать.

[[customalertview subviews] release];

ответ

2

Ваш код верен.

Вы отпускаете их после того, как вы добавили их в режим предупреждения, так как представление предупреждения заботится о их сохранении. Когда вы вызываете removeFromSuperview, он автоматически освобождается.

+0

Как removefromsuperview освободит объекты? –

+0

файл: ///Library/Developer/Shared/Documentation/DocSets/com.apple.adc.documentation.AppleiOS5_0.iOSLibrary.docset/Contents/Resources/Documents/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html# // apple_ref/occ/instm/UIView/removeFromSuperview –

+0

«Как removefromsuperview освободит объекты?» - это не имеет значения. Логика, которую вы должны использовать, - это если вы сохранили, скопировали или выделили объект, вы его выпустили; в противном случае вы этого не сделаете. Вы уже сбалансировали свой 'alloc' с' release', поэтому ваша работа выполнена. –

1

Вы делаете это правильно. Customalertview автоматически выпустит свои подпрограммы.

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

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

Надеюсь, он поможет вам понять, как все работает.

Если вы хотите узнать больше об управлении памятью вы посмотрите на яблоко документации может here

EDIT:

Я забыл упомянуть, что вам нужно будет выпустить свой собственный сигнал тревога тоже после вас убери это.

Если вы не понимаете, управления памятью вы посмотрите на можете: http://cocoadevcentral.com/d/learn_objectivec/ раздел 7

+0

Ваш третий пункт thiese lines «когда вы удаляете предупреждение, предупреждение будет выпущено, и все, что он сохранит, тоже будет выпущено». –

+0

Если я удалю Как его можно освободить? –

+0

Спасибо за хороший ответ, но все еще есть некоторые сомнения. –

2

Я думаю, что точки вам не хватает, на основе ваших комментариев по существующим ответам, являются следующими:

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

Включите ARC, как только сможете.

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