Сохранение и освобождение объекта делегату - PullRequest
0 голосов
/ 12 марта 2012

Я занимаюсь разработкой приложения для iOS 4 с последними SDK и XCode 4.2.

У меня вопрос о делегатах и ​​о том, как назначать / освобождать объекты для них.

Мой код:

#import <Foundation/Foundation.h>
#import "SBJson.h"
#import "WebServiceDelegate.h"

@interface UserWebService : NSObject
{
    SBJsonParser* parser;
    NSURLRequest* request;
    NSMutableData* receivedData;
    NSInteger response;

    id<WebServiceDelegate> delegate;
}

@property (nonatomic, readonly) NSInteger response;

- (id)initWithDelegate:(id<WebServiceDelegate>)del;

И его реализация:

#import "UserWebService.h"

@implementation UserWebService

@synthesize response;

- (id)initWithDelegate:(id<WebServiceDelegate>)del
{
    if (self = [super init])
    {
        delegate = [del retain];
        parser = [[SBJsonParser alloc] init];
    }
    return self;
}

-(void)dealloc
{
    [parser release];
    [request release];
    [receivedData release];

    [super dealloc];
}

Это правильно?

delegate = [del retain];

И, я должен выпустить del в dealloc?

Если я использую

delegate = del;

вместо

delegate = [del retain];

, я получаю EXC_BAD_ACCESS для объекта dealloc.

В двух словах,Я не уверен, правильно ли я назначил и выпустил объект del.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

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

Реализация методов доступа. В управляемой памяти программе, чтобы избежать сохраните циклы, метод установки не должен сохранять или копировать ваши делегат.

- (id)delegate {
    return delegate;
}

- (void)setDelegate:(id)newDelegate {
    delegate = newDelegate;
}

Источник

0 голосов
/ 12 марта 2012

Вам необходимо присвоить значение делегата следующим образом

@interface UserWebService : NSObject
{
    SBJsonParser* parser;
    NSURLRequest* request;
    NSMutableData* receivedData;
    NSInteger response;

    id<WebServiceDelegate> delegate;
}
@property (nonatomic, assign) id<WebServiceDelegate> delegate;
@property (nonatomic, readonly) NSInteger response;

- (id)initWithDelegate:(id<WebServiceDelegate>)del;

@implementation UserWebService

@synthesize response;

- (id)initWithDelegate:(id<WebServiceDelegate>)del
{
    if (self = [super init])
    {
         delegate = del;
        parser = [[SBJsonParser alloc] init];
    }
    return self;
}

Так что в этом случае вам не нужно освобождать делегата

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