Реализуя объект динамически - PullRequest
0 голосов
/ 19 июля 2011

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

Основной класс:

[ConnectionClass connectToServer];

Класс подключения:

@implementation ConnectionClass
 +(void)connectToServer{
   connectionClass = [[ConnectionClass alloc] init];
   [connectionClass createConnection];
 }
 -(void)createConnection{
    NSURLConnection *connection = [[NSURLConnection alloc] initWithDelegate:self];
  // create asynchronous connection
 }
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
   [self release];
 } 
@end

Хорошо ли освобождать себя в рамках своего собственного метода?

Что если я сделаю что-то таким образом;

Основной класс:

[connectionClass setDelegate:self];
[connectionClass connectToServer];

Класс подключения:

@implementation ConnectionClass
 -(void)connectToServer{
  [connectionClass createConnection];
 }
 -(void)createConnection{
  NSURLConnection *connection = [[NSURLConnection alloc] initWithDelegate:self];
  // create asynchronous connection
 }
 -(void)connectionDidFinishLoading:(NSURLConnection *)connection{
  [self.delegate finishedConnection:self]; // added delegate and then called to the main class and pass the self object for main to release it
 } 
 @end

И в делегате основного класса мы, освобождаем объект,

-(void)finishedConnection:(ConnectionClass*)connection
{
  [connection release];
 }

Есть ли проблема с освобождением объекта таким образом?

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

[самоотпуск] и [самосохранение] звучат для меня совершенно безумно.В этом нет никакого смысла ИМХО.И я не вижу смысла делать (void) connectToServer методом класса!

Ваш второй путь - это путь.Вы также можете сделать один шаг из двух, создав такой метод:

[connectionClass connectToServerWithDelegate: self];

1 голос
/ 19 июля 2011

Я бы сделал это:

@implementation ConnectionClass

+ (void)connectToServer {

    connectionClass = [[ConnectionClass alloc] init];
    [connectionClass createConnection];
    [connectionClass release];
}

- (void)createConnection {

    [self retain];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithDelegate:self];
    // create asynchronous connection
    [connection release];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [self release];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [self release];
}

@end

Таким образом, объект ConnectionClass является самосохраняющимся, и вы не несете ответственность за сохранение / освобождение в разных местах кода, которые тесно связаны между собой.

Редактировать: Как отмечает Рабскатран, если вы только изучаете сохранение / освобождение, то это не оптимальное решение.

Ваш второй пример с делегатом лучше. Я бы позволил объекту connectionClass быть переменной экземпляра, поэтому вы можете отправить объекту соединения сообщение об отмене операции, когда основной класс (который будет делегатом соединения) будет освобожден.

...