ObjC: Как правильно реализовать класс, который выпускает сам? - PullRequest
0 голосов
/ 05 января 2011

Я реализую представление входа в систему, и мне нужно, чтобы это представление отображалось в любое время в моем приложении.Поэтому, чтобы упростить процесс, я создаю метод класса с именем showLogin, и когда представление закрывается, я хочу, чтобы оно освободилось, поэтому я сделал следующее:

@implementation LoginController

@synthesize releaseOnClose;

+ (void)showLogin {
     LoginController *login = [[LoginController alloc] init];
     login.releaseOnClose = YES;
     [login show]; // Potential leak of login object
}

- (id)init {
     if (self = [super initWithNibName:@"Login" bundle:[NSBundle mainBundle]]) {
          releaseOnClose = NO;
     }
     return self;
}



- (void)show {
     if (self.view.superview == nil) {
          // show the view
     }
}



- (void)btnCloseTouched {
     [self.view removeFromSuperview];
     if (releaseOnClose) {
          [self release];
     }
}

Статический анализатор сообщает мне, что в showLogin есть потенциальная утечка, но на самом деле это не так, потому что я освобождаю объект в btnCloseTouched (не беспокойтесь о других функциях представления входа в систему, сейчас он просто открывается и закрывается).

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

Идея

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

Ответы [ 4 ]

2 голосов
/ 05 января 2011

Причина, по которой он жалуется на утечку, заключается в том, что вы выделяете память, которая не освобождается, например:

LoginController *login = [[LoginController alloc] init];

И то, как вы это делаете, кажется, все наоборот - вы не уверены, почему вы создаете новый объект LoginController внутри себя, а затем освобождаете себя в попытке освободить новый объект? Должен быть намного лучший способ сделать это.

Вам придется освободить экземпляр того, который вы выделили - self не является экземпляром нового, который вы выделили (логин).

Сделайте следующее, когда закончите:

[login release];
1 голос
/ 05 января 2011

в своем блоке @implementation вы можете объявить класс LoginController следующим образом:

@implementation LoginController

@synthesize releaseOnClose;

LoginController *mySingleLoginController;

, затем в вашем методе класса вы можете сделать:

+ (void)showLogin {
     mySingleLoginController = [[LoginController alloc] init];
...

Однако, как выбор дизайна яне рекомендую такой подход ...

Мози

0 голосов
/ 05 января 2011

Почему бы не сделать это обычным способом и позволить экземпляру, который инициализировал класс, освободить его или поместить в пул авто-выпуска?сам, когда происходит какое-то действие.Какова ваша мотивация сделать это таким образом?

0 голосов
/ 05 января 2011

Почему бы не создать новый класс для окна входа в систему (LoginView), а затем убедиться, что класс очищается после себя в dealloc. Затем вы можете создать новый экземпляр этого класса, когда вам это нужно, и при его удалении не должно быть утечки памяти.

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