我正在使用最新的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
对象。
答案 0 :(得分:1)
当您使用代表时,您的对象不应保留&amp;释放它,因为它不拥有它。
实施访问者方法。在内存管理程序中,要避免 保留周期,setter方法不应保留或复制你的 委派。
- (id)delegate {
return delegate;
}
- (void)setDelegate:(id)newDelegate {
delegate = newDelegate;
}
答案 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;
}
因此,在这种情况下,您不需要释放代理