0

私が取り組んでいるプロジェクトの 1 つで、すべての API 呼び出しに LRResty を使用しています。プロジェクトでメモリ リークが多発していることに気付いたので、すべてのリークを修正し、現在のアプリケーションの安定性を向上させる作業を与えられました。

シナリオは次のとおりです。 プロジェクト全体が ARC の下にありますが、LRResty は非アークです。View Controller は、自身をデリゲートとして渡す「CustomService」オブジェクトを初期化します。CustomService オブジェクトは、要求を処理して応答を返す LRResty クライアントを呼び出します。CustomService には、属性「weak」を持つプライベート プロパティ リクエストがあります。

問題は次のとおりです: 計測器 (iPhone またはシミュレーター) を実行すると、プロパティ要求属性が「弱い」と「強い」の両方の場合で、リークが検出されます。リクエスト (LRRestyRequest) が弱い (この場合、customService dealloc が呼び出されます)。それ以外の場合、customService は保持サイクルに陥り、dealloc は呼び出されません。属性が「弱い」の場合、リークは「malloc」であり、ソースを特定できませんが、属性を「strong」に変更すると、「Instruments」は initWithDelegate:self と [customService serviceScheduleRequest] でリークし、customService の dealloc を示します呼び出されることはありません。

このコードが漏れないようにするにはどうすればよいですか? 私は何時間も費やしましたが、手がかりがありません。LRResty フレームワークがそのメモリの問題を担当している可能性はありますか? このフレームワークを使用した経験のある人はいますか?

MyViewController

CustomService *customService = [[CustomService alloc] initWithDelegate:self]; 
[customService serviceScheduleRequest];

CustomService.h

@protocol CustomServiceDelegate;

@interface CustomService : Service <LRRestyClientResponseDelegate>

@property (nonatomic, weak) id<CustomServiceDelegate> delegate;

- (id) initWithDelegate:(id)aDelegate;
- (void)serviceScheduleRequest;

@end

@protocol CustomServiceDelegate <NSObject>

@optional

- (void) serviceScheduleRequestDidStart;
- (void) serviceScheduleRequestDidEndWithSuccessJSON:(id) JSON;
- (void) serviceScheduleRequestDidEndWithSuccess:(BOOL) status;
- (void) serviceScheduleRequestDidEndWithError:(NSError *)error;

@end

CustomService.m

@interface CustomService ()

@property (nonatomic, weak) LRRestyRequest *request;

@end

@implementation CustomService

@synthesize delegate=_delegate;

- (id) initWithDelegate:(id)aDelegate
{
    self = [super init];

    if (self)
    {
        _delegate = aDelegate;
    }
    return self;
}

- (void)serviceScheduleRequest
{
    NSMutableDictionary* parameters = [self getParams];

    self.private_request = [[LRResty client] post:@"http://mylink.com/apicall"
                                  payload:parameters
                                 delegate:self];
}


- (NSMutableDictionary*) getParams
{
    NSMutableDictionary* parameters = [super getParams];
    return parameters;
}


- (void)restClient:(LRRestyClient *)client receivedResponse:(LRRestyResponse *)response
{   
    [self.delegate callSomeMethod];
    // do something...
}

- (void) dealloc
{
    NSLog(@"\n\n\n\n dealloc gets called \n\n\n\n");
}

@end

誰かに手がかりを与える場合に備えて、スタックトレース

0 libsystem_c.dylib realloc
1 Foundation _NSMutableDataGrowBytes
2 Foundation -[NSConcreteMutableData appendBytes:length:]
3 Foundation -[NSConcreteMutableData appendData:]
4 MyApp -[LRURLRequestOperation connection:didReceiveData:] /Users/admin/.jenkins/jobs/LRResty Nightly Builds/workspace/Classes/LRURLRequestOperation.m:107
5 MyApp -[LRRestyRequest connection:didReceiveData:] /Users/admin/.jenkins/jobs/LRResty Nightly Builds/workspace/Classes/LRRestyRequest.m:177
6 Foundation ___NSURLConnectionDidReceiveData_block_invoke_0
7 Foundation __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0
8 Foundation -[NSURLConnectionInternalConnection invokeForDelegate:]
9 Foundation -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
10 Foundation -[NSURLConnectionInternal _withActiveConnectionAndDelegate:]
11 Foundation _NSURLConnectionDidReceiveData
12 CFNetwork ___delegate_cacheTrifecta_block_invoke_0
13 CFNetwork ___withDelegateAsync_block_invoke_0
14 CFNetwork ___performAsync_block_invoke_068
15 CoreFoundation CFArrayApplyFunction
16 CFNetwork RunloopBlockContext::perform()
17 CFNetwork non-virtual thunk to RunloopBlockContext::multiplexerClientPerform()
18 CFNetwork MultiplexerSource::perform()
19 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
20 CoreFoundation __CFRunLoopDoSources0
21 CoreFoundation __CFRunLoopRun
22 CoreFoundation CFRunLoopRunSpecific
23 CoreFoundation CFRunLoopRunInMode
24 Foundation -[NSRunLoop(NSRunLoop) runMode:beforeDate:]
25 Foundation -[NSRunLoop(NSRunLoop) run]
26 MyApp -[LRURLRequestOperation start] /Users/admin/.jenkins/jobs/LRResty Nightly Builds/workspace/Classes/LRURLRequestOperation.m:63
27 MyApp -[LRRestyRequest start] /Users/admin/.jenkins/jobs/LRResty Nightly Builds/workspace/Classes/LRRestyRequest.m:136
28 Foundation __block_global_6
29 libdispatch.dylib _dispatch_call_block_and_release
30 libdispatch.dylib _dispatch_client_callout
31 libdispatch.dylib _dispatch_root_queue_drain
32 libdispatch.dylib _dispatch_worker_thread2
33 libsystem_c.dylib _pthread_wqthread
34 libsystem_c.dylib start_wqthread
4

0 に答える 0