我正在为一个对象创建自己的委托,但是我发现了一些问题......当我的委托被调用时,对象Client并不存在于内存中。
如果我将客户端对象声明为UIViewController的属性,问题就解决了,但我认为它不是一个好的解决方案。
为什么我的对象不在内存中?
更新示例代码:
//Class UIViewController
-(void)viewDidLoad {
[super viewDidLoad];
Client *client = [[Client alloc] initWithDelegate:self];
[client login]; //It has two delegates methods (start and finish)
}
//In the same class, the delegate methods:
- (void) start
{
//DO START STUFF
}
-(void) finish
{
// DO FINISH STUFF
}
Client.h
@interface Client : NSObject <IClient>
@property (nonatomic,assign) id<IClient> _delegate;
-(void)login;
-(id)initWithDelegate:(id<IClient>)delegate;
@end
Client.m
@implementation Client
@synthesize _delegate;
//Constructor
- (id) initWithDelegate:(id)delegate
{
self = [super init];
if(self)
{
self._delegate = delegate;
}
return self;
}
-(void)login
{
//Do stuff asynchronously like NSURLConnection
//Not all code, just a part:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:NO];
[connection start];
}
//Delegate method of NSURLConnection that login method fires
//Just implemented one method delegate of NSURLCOnnection for the example
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
NSLog(@"ERROR");
[_delegate stop]; //<---CRASH!!!
}
@end
IClient.h
@protocol IClient <NSObject>
- (void) start;
- (void) finish;
@end
当我使用NSURLConnection
时,委托方法像param一样传递给自己的NSURLConnection
,但我不知道我需要如何实现我的代理:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
答案 0 :(得分:1)
当我使用NSURLConnection时,委托方法像param一样传递自己的NSURLConnection
如果我正确理解Google翻译,您希望您的委托方法接收委托对象本身作为参数。那你为什么不简单地用这种方式实现逻辑呢?
在代表中:
- (void)delegateCallback:(DelegatingObject *)obj
{
// whatever
}
在委托类/对象中:
[self.delegate delegateCallback:self];
答案 1 :(得分:1)
您正在使用ARC,并且一旦viewDidLoad方法完成,客户端对象就没有强引用,因此将其取消分配。如果你使用的是MRC,那么你就会泄漏内存。
解决方案 将其作为属性或ivar存储在视图控制器中,我不明白为什么你认为这是一个坏主意。如果视图控制器关闭屏幕或其他任何内容,它还为您提供取消对象(如果适用)的机会。