- (недействительно) dealloc Вопрос - PullRequest
1 голос
/ 30 декабря 2010

Можете ли вы сказать мне, если следующий код на 100% правильный? Особенно dealloc раздел

FirstViewController.h

#import <UIKit/UIKit.h>
#import "SecondViewController.h"

@class SecondViewController

@interface FirstViewController : UIViewController
{
    SecondViewController   *SecondController;
}

- (IBAction)SwitchView;

@property (nonatomic, retain) IBOutlet SecondViewController *SecondController;

@end

FirstViewController.m

#import "FirstViewController.h"

@implementation FirstViewController

@synthesize SecondController;

- (IBAction)SwitchView
{    
    SecondController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    SecondController.modalTransitionStyle = UIModalPresentationFullScreen;
    [self presentModalViewController:SecondController animated:YES];
    [SecondController release];
}

/// OTHER CODE HERE ///

- (void)dealloc
{
    [SecondController release];
    [super dealloc];
}

@end

Спасибо!

Ответы [ 2 ]

8 голосов
/ 30 декабря 2010

Нет, это не правильно.Вы отправляете сообщение release указателю в dealloc, но указатель может указывать или не указывать на SecondController.Это может привести к некоторым очень странным ошибкам, обычно к случайным объектам.

С точки зрения target-c, ваш класс не сохраняет (думает «свой») SecondController, поэтому он не должен пытаться выпустить егово-первых, на dealloc.

. Чтобы правильно заявить о праве собственности и освободить его, сделайте так:

- (IBAction)SwitchView
{    
    self.SecondController = [[[SecondViewController alloc] 
                  initWithNibName:@"SecondViewController" bundle:nil] autorelease];
    self.SecondController.modalTransitionStyle = UIModalPresentationFullScreen;
    [self presentModalViewController:self.SecondController animated:YES];
}

/// OTHER CODE HERE ///

- (void)dealloc
{
    self.SecondController = nil;
    [super dealloc];
}

Это также защитит вас от любых других вещей, происходящих между SwitchView и dealloc.(до тех пор, пока этот материал следует правилам и использует self.SecondController = ... для изменения свойства)

В SwitchView последовательность alloc / autorelease гарантирует, что ваша подпрограмма сохраняет владение для длины подпрограммы(и немного дальше).Часть self.SecondController = гарантирует, что ваш класс сохраняет объект SecondController, поскольку вы объявили его (nonatomic,retain).

4 голосов
/ 30 декабря 2010

Вы должны использовать свойство setter, чтобы назначить SecondController.

Я предлагаю вам только alloc/init этот контроллер просмотра один раз, тогда в SwitchView покажите его:

#import "FirstViewController.h"

@implementation FirstViewController

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
   if((self = [super initWithNibName:nibName bundle:nibBundle])) {
      self.SecondController = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
      SecondController.modalTransitionStyle = UIModalPresentationFullScreen;
   }
   return self;
}

- (IBAction)SwitchView
{    
    [self presentModalViewController:SecondController animated:YES];
}

/// OTHER CODE HERE ///

- (void)dealloc
{
    [SecondController release];
    [super dealloc];
}

@end

Таким образом, вы фактически создаете этот SecondController контроллер представления только один раз, а не создаете его каждый раз, когда вызывается -SwitchView.

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