在Objective C中创建NSURLConnection等委托

时间:2013-03-07 15:18:48

标签: ios objective-c delegates nsurlconnection

我正在为一个对象创建自己的委托,但是我发现了一些问题......当我的委托被调用时,对象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

2 个答案:

答案 0 :(得分:1)

  

当我使用NSURLConnection时,委托方法像param一样传递自己的NSURLConnection

如果我正确理解Google翻译,您希望您的委托方法接收委托对象本身作为参数。那你为什么不简单地用这种方式实现逻辑呢?

在代表中:

- (void)delegateCallback:(DelegatingObject *)obj
{
    // whatever
}

在委托类/对象中:

[self.delegate delegateCallback:self];

答案 1 :(得分:1)

您正在使用ARC,并且一旦viewDidLoad方法完成,客户端对象就没有强引用,因此将其取消分配。如果你使用的是MRC,那么你就会泄漏内存。

解决方案 将其作为属性或ivar存储在视图控制器中,我不明白为什么你认为这是一个坏主意。如果视图控制器关闭屏幕或其他任何内容,它还为您提供取消对象(如果适用)的机会。