[ios] delegate must live longer than owner

http://stackoverflow.com/questions/5091693/check-if-delegate-still-exists-before-calling-respondstoselector

To avoid delegate crash delegate must live longer than owner

Or owner’s delegate property must be weak reference

Sample Code :

https://github.com/sungkipyung/CodeSample/blob/master/DelegateCrashTryCatchExample/DelegateCrashTryCatchExample/ViewController.m


#import "ViewController.h"
#import "SimpleObject.h"

@interface ViewController ()

@property (nonatomic, strong) SimpleObject *obj;
@property (nonatomic, assign) iddelegate;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.obj = [[SimpleObject alloc] init];
self.delegate = self.obj;
NSLog(@"self.delegate address : %ud", self.delegate);
}

//overcome crash
- (void)setObj:(SimpleObject *)obj
{
_obj = obj;
self.delegate = obj;
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)actionDelegateCall:(id)sender {
@try {
NSLog(@"self.delegate address : %ud", self.delegate);
[self.delegate helloWorld]; // what the hell !!!
// delegate must live longer than me!
}
@catch (NSException *exception) {
NSLog(@"%@", exception);
}
@finally {
NSLog(@"Overcome Exception");
}

}
- (IBAction)actionDeallocObj:(id)sender {
NSLog(@"self.delegate address : %ud", self.obj);
NSLog(@"self.delegate address : %ud", self.delegate);

self.obj = nil;
NSLog(@"self.delegate address : %ud", self.obj);
NSLog(@"self.delegate address : %ud", self.delegate);
}

@end

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중