保留和释放对象的代理

时间:2012-03-12 08:58:45

标签: ios memory-management delegates

我正在使用最新的SDK和XCode 4.2开发iOS 4应用程序。

我有一个关于代表以及如何为其分配/释放对象的问题。

我的代码是:

#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];

而且,我是否要在dealloc发布del

如果我使用

delegate = del;

而不是

delegate = [del retain];

我在对象dealloc上获得 EXC_BAD_ACCESS

简而言之,我不确定我是否正确分配和释放del对象。

2 个答案:

答案 0 :(得分:1)

当您使用代表时,您的对象不应保留&amp;释放它,因为它不拥有它。

  

实施访问者方法。在内存管理程序中,要避免   保留周期,setter方法不应保留或复制你的   委派。

- (id)delegate {
    return delegate;
}

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

Source

答案 1 :(得分:0)

您需要像这样分配委托值

@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;
}

因此,在这种情况下,您不需要释放代理