سؤال

عند استخدام كائن Objective-C الذي يعيد بشكل غير متزامن مع معالج الانتهاء ، مثل AvassetexportSession ، هل هناك أي شيء مع كود مثل هذا:

AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset: composition presetName: AVAssetExportPresetHighestQuality];
[exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
    // export completed
    NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
    [exportSession release];
    }];

تقارير الأدوات الصادرات باعتبارها تسرب. لقد حصلت أيضًا على عدد قليل من الفصول الدراسية التي تستخدم نفس المنهجية ويتم الإبلاغ عنها أيضًا كتسربات.

من كل ما قرأته ، يبدو أن الكود يجب أن يتبع قواعد إدارة الذاكرة المناسبة ولكن يجب أن يكون هناك شيء ما. لقد وجدت رابطًا إلى هذه المقالة, ، لكنني لا أعتقد أنني أتسبب في احتباس دوري.

هل كانت مفيدة؟

المحلول

كتل في الهدف-C تأخذ تلقائيا الملكية من الأشياء في نطاقها ، وتسبب مرجع دوري. يحتفظ كتلةك exportSession ضمنيًا ، و exportSession من المحتمل أن يحتفظ بكتلك.

تقول قواعد إدارة الذاكرة إنه يجب عليك التخلي عن ملكية الكائنات بأسرع ما يمكن. لذلك ، فإن المكان المناسب للقيام بذلك ، في حالتك ، هو بعد الدعوة إلى exportAsynchronouslyWithCompletionHandler:.

AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset: composition presetName: AVAssetExportPresetHighestQuality];
[exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
    // export completed
    NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
}];
[exportSession release];

يجب أن يكون المرجع الدوري واضحًا بهذه الطريقة: exportSession سيتم الاحتفاظ بها على قيد الحياة من قبل الكتلة ، وسيتم الاحتفاظ بالكتلة نفسها على قيد الحياة من قبل الكائن.

عندما تتعامل مع الكتل ، أقترح عليك استخدام البيئة التي تم جمعها القمامة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top