-2

オブジェクトの独自のデリゲートを作成していますが、いくつかの問題が見つかりました...デリゲートが呼び出されたときに、オブジェクト Client がメモリに存在しません。

Client Object を UIViewController のプロパティのように宣言すれば問題は解決しますが、良い解決策ではないと思います。

オブジェクトがメモリにないのはなぜですか?

UPDATED コード例:

//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 the own のように渡されますが、次のNSURLConnectionようにデリゲートをどのように実装する必要があるかわかりません。

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

2 に答える 2

1

NSURLConnection を使用すると、デリゲート メソッドは param のように独自の NSURLConnection を渡します

私が Google 翻訳を正しく理解していれば、委任メソッドが委任オブジェクト自体を引数として受け取る必要があります。それでは、そのように単純にロジックを実装してみませんか?

デリゲートで:

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

委任クラス/オブジェクト:

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

ARC を使用しており、viewDidLoad メソッドが完了すると、クライアント オブジェクトには強い参照がないため、割り当てが解除されます。MRC を使用していた場合、メモリ リークが発生します。

解決策、ビュー コントローラーにプロパティまたは ivar として保存することです。なぜこれが悪い考えだと思うのかわかりません。また、View Controller が画面から消えた場合などに、オブジェクトをキャンセルする機会も与えられます (該当する場合)。

于 2013-03-07T21:54:24.743 に答える