تحرير الكائنات في كتل الهدف-C
-
02-10-2019 - |
سؤال
عند استخدام كائن 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
سيتم الاحتفاظ بها على قيد الحياة من قبل الكتلة ، وسيتم الاحتفاظ بالكتلة نفسها على قيد الحياة من قبل الكائن.
عندما تتعامل مع الكتل ، أقترح عليك استخدام البيئة التي تم جمعها القمامة.