2012-03-12 70 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