Я получаю пару утечек вокруг UIImagePickerController
, и это была одна из них.Общая утечка составила 208 байт.Я обнаружил, что если типы носителей указаны с использованием кода CoreFoundation
C, эта утечка исчезнет.
Таким образом, утечки следующего кода:
imagePickerController.mediaTypes = [NSArray arrayWithObjects:(NSString*)kUTTypeImage, (NSString*)kUTTypeMovie, nil];
Может быть заменен следующим кодом, которыйне вызывает такой же утечки:
CFStringRef mTypes[2] = { kUTTypeImage, kUTTypeMovie };
CFArrayRef mTypesArray = CFArrayCreate(CFAllocatorGetDefault(), (const void**)mTypes, 2, &kCFTypeArrayCallBacks);
imagePickerController.mediaTypes = (NSArray*)mTypesArray;
CFRelease(mTypesArray);
Моя теория состоит в том, что утечка не предоставляет информацию, которую предоставляет заключительный аргумент рабочего кода.kCFTypeArrayCallBacks
предоставляет CFArray
, созданный с информацией, необходимой для правильного хранения и освобождения объектов, которые он содержит (используя CFRetain
и CFRelease
).Эти объекты это CFStringRefs..
.Утверждающее утверждение приводит эти CFStringRefs
к NSStrings
, и я думаю, что NSArray
использует стандарт Objective-C для сохранения и выпуска сообщений на своих объектах.
Эта теория может показаться фиктивной, потому что CFArray
и NSArray
являются бесплатными мостами, и это должно "просто работать".Пока я придерживаюсь этого - единственное существенное различие между двумя фрагментами кода выше, которое бросается в глаза.