Статический анализатор прав;Ваш код - возможная утечка памяти.Поскольку статический анализ не может доказать, что метод MemTestViewController
dealloc
всегда будет вызываться (это, в конечном счете, решит проблему остановки), статический анализатор не может быть уверен, что goodSound
будетправильно выпущено.
Современный Objective-C редко использует прямой доступ к ivar в методах init
и dealloc
.Вы должны объявить @property (retain)
для вашего goodSound
, даже если он частный, и использовать его в других местах вашего класса, в том числе в методе viewDidLoad
.Статический анализатор должен затем правильно распознать этот шаблон, а не помечать линию как предупреждение.
На заметке - на всякий случай - ваш -[SoundClass initializeSound:]
должен быть назван как -[SoundClass initWithSoundFileName:]
длясоглашение о совпадении, и должно быть написано с защитой для проверки nil
возврата от [super init]
:
-(id)initWithSoundFileName:(NSString*)soundFileName
{
self = [super init];
if(self != nil) {
NSString *const resourceDir = [[NSBundle mainBundle] resourcePath];
NSString *const fullPath = [resourceDir stringByAppendingPathComponent:soundFileName];
NSURL *const url = [NSURL fileURLWithPath:fullPath];
OSStatus errCode = AudioServicesCreateSystemSoundID((CFURLRef) url, &soundHandle);
if(errCode == 0)
NSLog(@"Loaded sound: %@", soundFileName);
else
NSLog(@"Failed to load sound: %@", soundFileName);
}
return self;
}
Всегда лучше добавить эту защиту, особенно потому, что вы вызываете код C, который можетне обрабатывать nil/NULL
так хорошо, как Objective-C.