2012-02-23 3 views
-1

Можно создать дубликат:
How do I use NSTimer
Decrement IssueНекорректное декремент счетчика ссылок в анализаторе

Я действительно изо всех сил, чтобы избавиться от следующего предупреждения:

Неправильный декремент ссылочного счета объекта, который i s на данный момент не принадлежит вызывающему.

Код компилируется отлично, и приложение, похоже, работает нормально. В основном я пытаюсь создать объект класса для воспроизведения короткого аудиоклипа при нажатии кнопки. Я создал класс для воспроизведения файла, и объекты передаются именам файлов в виде строки.

Вот код:

- (IBAction) playKick 
{   
    PlayAudio *thisPlayAudio= [[[PlayAudio alloc] init] playFile:(@"RockSnare")]; 
    [thisPlayAudio release]; 
} 

Я прочитал другие сообщения и любая помощь будет высоко ценится!

+0

сделайте это autorelease. – fibnochi

+0

Эй, спасибо за ответ! Ive попробовал autorelease с помощью этого кода - (IBAction) playKick { PlayAudio * thisPlayAudio = [[[[PlayAudio alloc] init] playFile: (@ "file")] autorelease]; }, но затем я получаю предупреждение «неиспользуемая переменная» и предупреждение «анализатора» все еще не идет! – Martin

+1

Этот код выглядит хорошо (если он написан немного необычно и, возможно, опирается на детали реализации). Вы уверены, что проблема связана с этим методом? На какой строке указывает предупреждение? – Jasarien

ответ

1

Каков тип возврата метода playFile:? Вы уверены, что он возвращает тот же объект, на который вы его называете?

Может быть, ваш код должен быть:

PlayAudio *thisPlayAudio= [[PlayAudio alloc] init]; 
[thisPlaysAudio playFile:@"RockSnare"]; 
[thisPlaysAudio release]; 

или даже

[[[[PlayAudio alloc] init] autorelease] playFile:(@"RockSnare")]; 
2

Мне нужно будет увидеть определение класса для PlayAudio, но сомнительно, что метод playFile возвращает свой экземпляр PlayAudio. Вы, наверное, хотите:

PlayAudio *thisPlayAudio = [[PlayAudio alloc] init]; 
[thisPlayAudio playFile:(@"RockSnare")]; 
[thisPlayAudio release]; 
2

Может быть, это поможет:

- (IBAction) playKick { 
    PlayAudio *thisPlayAudio= [[PlayAudio alloc] init]; 
    [thisPlayAudio playFile:(@"RockSnare")]; 
    [thisPlayAudio release]; 
} 

Это завершает создание объекта и присваивает его thisPlayAudio, затем воспроизводит звук. У вас есть настройки thisPlayAudio для результата вызова playFile.

+0

Эй, ребята, спасибо вам за то, что нашли время ответить! Я очень ценю это. Извините, я дважды отправил этот вопрос. Я не был уверен, что он опубликован должным образом изначально. И спасибо Алмо! Выше работали! Я могу попытаться бежать, прежде чем я смогу ходить! С наилучшими пожеланиями. Martin – Martin

+0

Вопрос, похоже, был объединен с другим, поэтому вы можете выбрать ответ, который помог больше всего, нажав на checkmark. И теперь вы знаете, как система работает в следующий раз, когда вам нужна помощь. :) – Almo

1

Вы пытаетесь немедленно освободить объект после создания. Возможно, вы также делаете что-то не так в методе playFile. И ваш плеер не будет воспроизводить файлы с момента создания и удаления в одной области. Попробуйте следующее:

PlayAudio *thisPlayAudio = nil; 
- (IBAction) playKick { 
    if (thisPlayAudio){ 
     [thisPlayAudio release]; thisPlayAudio = nil; 
    } 
    thisPlayAudio= [[PlayAudio alloc] init] autorelease]; 
    [thisPlayAudio playFile:(@"RockSnare")]; 
} 
+0

эй большое спасибо за вашу помощь! Теперь я разобрался! – Martin

Смежные вопросы