Моя программа имеет утечку памяти - PullRequest
0 голосов
/ 08 ноября 2011
-(IBAction)play2;

{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef =CFBundleCopyResourceURL(mainBundle, 
                                             (CFStringRef) @"Bear3", CFSTR ("wav"), NULL);

    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
}

Это дает мне ошибку:

potential leak of an object allocated " CFBundleResourceURL
returns a Core Foundation object with a +1 retain count

Ответы [ 5 ]

2 голосов
/ 08 ноября 2011

CFBundleCopyResourceURL содержит копию, поэтому ваш счет удержания на soundFileURLRef фактически равен 1. Когда вы закончите с этим, позвоните CFRelease(soundFileURLRef), чтобы уменьшить ваш счет удержания.

В дополнение к ошибке, которую выПолучается, что ответ SAKrisT о вызове AudioServicesDisposeSystemSoundID для объекта, который вы создали с помощью AudioServicesCreateSystemSoundID, также заслуживает внимания.

2 голосов
/ 08 ноября 2011

CFBundleCopyResourceURL создает CFURLRef объект , которым вы владеете , поэтому вам нужно в какой-то момент отказаться от владения этим объектом с помощью CFRelease.Точно так же вам нужно будет сбалансировать ваш вызов на AudioServicesCreateSystemSoundID с другим вызовом на AudioServicesDisposeSystemSoundID.

. Для Базовой Основы функции, в названии которых содержится слово Create или Copy, возвращают объект, который вывладеть, поэтому вы должны отказаться от владения им, когда вы закончите с ним.Для получения дополнительной информации об управлении памятью Core Foundation см. Руководство по программированию управления памятью Core Foundation *1013*.

Просто, чтобы дать вам подсказку, я бы, вероятно, справился с управлением памятью следующим образом (хотя у меня нетнекоторое время не кодировал Objective-C).Это также предполагает, что вы хотите сохранить ссылку на URL по любой причине:

@interface MyClass
{
    CFURLRef soundFileURLRef;
    UInt32 soundID;
}

@end

@implementation MyClass

- (id) init
{
    self = [super init];
    if (!self) return nil;

    CFBundleRef mainBundle = CFBundleGetMainBundle();

    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, CFSTR("Bear3"), CFSTR("wav"));

    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);

    return self;
}

- (void) dealloc
{
    AudioServicesDisposeSystemSoundID(soundID);
    CFRelease(soundFileURLRef);
    [super dealloc];
}

- (IBAction) play2
{
    AudioServicesPlaySystemSound(soundID);
}
2 голосов
/ 08 ноября 2011

AudioServicesCreateSystemSoundID (soundFileURLRef, & soundID);- утечка здесь, потому что добавлено create для сохранения количества

использование AudioServicesDisposeSystemSoundID после воспроизведения звука

1 голос
/ 10 ноября 2011

Если вы не используете ARC (доступно в xcode 4.2), вам нужно освободить все, что вы выделите.добавить [alert release] после [alert show].

0 голосов
/ 10 ноября 2011

Когда вы используете ключевое слово «alloc», это означает, что вы выделяете некоторое пространство памяти для вашего объекта.Теперь, если вы не выпустите его самостоятельно или не осуществите его автозапуск, то это покажет «утечка памяти».Это касается не только uialertview, но и любых других объектов.Возможно, вы захотите освободить объект alertview в методе dealloc (), но все равно он будет показывать утечку памяти, так как память не используется в течение длительного времени.Итак, сначала вы показываете оповещение с помощью [alert show], затем вам больше нужен объект, поэтому отпустите его с помощью [alert release];Наслаждаться !!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...