【发布时间】:2016-01-13 07:23:14
【问题描述】:
我有一个名为 RequestController 的类,它负责下载、解析数据并将它们放在一个强大的属性数组中,该数组可以从父级访问。
这里的问题是初始化RequestController 的方法被执行了不止一次并且使用分配我注意到它发生了内存泄漏并且对象永远不会被释放。 RequestController 变量是一个 iVar。 RequestController 也有一个返回给父控制器的委托。
RequestController.h
#import <Foundation/Foundation.h>
//================
@protocol RequestControllerDelegate <NSObject>
@required
- (void)RequestControllerRequestSuccessful:(NSInteger)mode;
- (void)RequestControllerRequestFailedWithError:(NSInteger)code;
@end
//=================
@interface RequestController : NSObject <NSURLSessionDataDelegate>
@property (nonatomic, assign) id <RequestControllerDelegate> delegate;
@property(nonatomic,strong)NSMutableArray *resultArray;
@property(nonatomic,strong)NSMutableArray *purposesArray;
-(instancetype)initAndRegisterUserWithTelephone:(NSString*)tel Delegate:(id<RequestControllerDelegate>)del;
-(void)nulifyArrays;
@end
在RequestController.m
中初始化对象@implementation RequestController{
NSURLSession *conn;
NSArray *responseArray;
NSMutableData *responseData;
NSString *reqEmail;
}
@synthesize delegate,resultArray;
#pragma mark - Init Functions
-(instancetype)initAndRegisterUserWithTelephone:(NSString*)tel Delegate:(id<RequestControllerDelegate>)del{
self = [super init];
if (self) {
currentMode=RQRegisterMode;
self.delegate=del;
//Check for internet connection
bool internet = [self internetConnectivity];
//Sending the requests on the server
if(internet){
NSString* url = [NSString stringWithFormat:@"%@/someurlwithparams",API_URL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
NSString *param= [NSString stringWithFormat:@"method=%@",tel];
NSData *requestBodyData = [param dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = requestBodyData;
// Specify that it will be a POST request
request.HTTPMethod = @"POST";
NSURLSessionConfiguration *sessionConfig =[NSURLSessionConfiguration defaultSessionConfiguration];
conn = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *dataTask= [conn dataTaskWithRequest:request];
[dataTask resume];
}
else
{
//No internet connection
[delegate RequestControllerRequestFailedWithError:RCNoInternetError];
}
}
return self;
}
在父控制器中,我将对象初始化为:
req = [[RequestController alloc]initAndRegisterUserWithTelephone:fullTel Delegate:self];
我有这些代表:
-(void)RequestControllerRequestSuccessful:(NSInteger)mode{
[SVProgressHUD dismiss];
[self manageError:NoError];
//Copying the data to local variable
self.array = [NSMutableArray alloc]initWithArray:[req resultArray]];
}
-(void)RequestControllerRequestFailedWithError:(NSInteger)code{
[SVProgressHUD dismiss];
[self manageError:code];
}
到目前为止一切顺利,但是一旦我重新初始化 RequestController,就会出现内存泄漏。 我在这里做错了什么?
更新 1 此行导致泄漏:
conn = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
更新 2
用nil 替换self 可以解决问题,但我需要NSURLSession
【问题讨论】:
标签: ios objective-c memory-management memory-leaks