-2

我正在为一个对象创建自己的委托,但我发现了一些问题......当我的委托被调用时,对象 Client 不存在于内存中。

如果我将 Client Object 声明为 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
}

客户端.h

@interface Client : NSObject <IClient>

@property (nonatomic,assign) id<IClient> _delegate;
-(void)login;
-(id)initWithDelegate:(id<IClient>)delegate;

@end

客户端.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

客户端.h

@protocol IClient <NSObject>

- (void) start;
- (void) finish;

@end

当我使用NSURLConnection时,委托方法像 param the own 一样传递NSURLConnection,但我不知道我需要如何实现我的委托,如下所示:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
4

2 回答 2

1

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

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

在代表中:

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

在委托类/对象中:

[self.delegate delegateCallback:self];
于 2013-03-07T15:41:12.433 回答
1

您正在使用 ARC,并且一旦 viewDidLoad 方法完成,客户端对象就没有强引用,因此它被释放。如果您使用的是 MRC,那么您将泄漏内存。

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

于 2013-03-07T21:54:24.743 回答