У меня есть класс под названием RequestController
, который отвечает за загрузку, разбор данных и помещает их в массив свойств, доступный из родителя.Инициализация пользовательского класса с iVar, вызывающим утечку памяти - iOS
Проблема заключается в том, что метод, инициализирующий RequestController
, выполняется более одного раза и с использованием Allocations я заметил, что это происходит с утечкой памяти и объектами, которые никогда не выпускаются. Переменная 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 у меня есть утечка памяти. Что я здесь делаю неправильно?
Update 1 Эта линия вызывает утечку:
conn = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
Update 2
Замена self
с nil
решает эту проблему, но мне нужны делегаты NSURLSession
Спасибо за ваш ответ. Я знаю об AFNetworking, но мой вопрос касался решения проблемы с утечкой памяти. – BlackM