2012-03-12 72 views
0

我正在开发包含最新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

回答

1

当你使用委托时,你的对象不应该保留&版本,因为它不拥有它。

实现访问器方法。在内存管理程序中,为避免保留周期,setter方法不应保留或复制您的代理。

- (id)delegate { 
    return delegate; 
} 

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

Source

+1

这是正确的,它还值得一提的是,通常假定代表超出了它是代表的对象,或者这种模式发生故障。 – jrturton 2012-03-12 09:08:17

+0

我已更新我的问题,并提供更多详细信息。如果我不保留del,我会得到一个错误。 – VansFannel 2012-03-12 09:22:54

+0

你确定你没有在'UserWebService'对象之前释放委托对象吗? – Alexander 2012-03-12 09:29:28

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

委托值因此,在这种情况下,你不需要释放委托

+0

我已更新我的问题,并提供更多详细信息。如果我不保留del,我会得到一个错误。 – VansFannel 2012-03-12 09:23:33

+0

不要在dealloc中释放委托。 如果你正在分配任何对象,那么你不需要释放它。 – 2012-03-12 09:26:26

+0

不,我没有在dealloc中释放委托。 – VansFannel 2012-03-12 09:28:43