【发布时间】:2017-10-12 22:05:53
【问题描述】:
我创建了一个在目标中使用 NSURLSession 的类,它调用远程服务器并获取数据。
Server.h 文件:
@protocol SeverDelegate;
@interface Server : NSObject {
NSString * _urlString;
NSURLSession * _session;
}
@property(nonatomic, weak)id <ServerDelegate> delegate;
+(id) initWithUrl: (NSString *) urlString;
- void getData();
@end
@protocol ServerDelegate<NSObject>
@optional
-(void) success:(Server *) server;
@end
Server.m 文件:
@implementation Server
@synthesis delegate;
+(id) initWithUrl: (NSString *) urlString {
if (self = [super init]) {
_urlString = urlString;
}
}
-(void) getDataFromServer {
NSURL *url = [NSURL URLWithString: _urlString];
__weak __typeof(self) weakSelf = self;
NSURLSessionDataTask *dataTask = [_session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error != nil) {
}
if (data != nil) {
dispatch_async(dispatch_get_main_queue(), ^{
_responseData = data;
if ([weakSelf.delegate
respondsToSelector:@selector(success:)]) {
[weakSelf.delegate success:self]; // here is memory leak
}
});
}
}];
[dataTask resume];
[_session finishTasksAndInvalidate];
}
这是从另一个类中调用的,如下所示:
Server *request = [Server initWithURL:downloadUrl];
request.delegate = self;
[request getData];
#Pragma mark Delegate method:
-(void) success:(Server *) server {
// do other stuff
}
为了避免保留循环,我使用了weakSelf,但是从服务器获取数据后传递self,存在内存泄漏。这里也可以使用weakSelf来避免,但不会将Server对象传递给调用类中实现的委托方法。
那么,应该怎么做才能消除内存泄漏并将服务器对象传递给另一个类中实现的委托方法?
【问题讨论】:
标签: ios objective-c xcode memory-management