【发布时间】:2011-09-08 18:33:18
【问题描述】:
我有一个在 iOS 上录制音频的课程。我有一个audioSettings 的类变量,它是一个带有录音机设置的字典。我在类加载时创建此obj 一次,然后调用recordAudio 方法,我将该字典分配给录音机。录制完成后我release 和nil audioRecorder。代码如下:
- (void) recordAudio: (NSURL *) fileURL {
NSError * error = nil;
if (!audioSettings) {
//If no dict, fill it
[self setDefaultSettings];
}
audioRecorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:audioSettings error:&error];
//audioRecorder.delegate = self;
if (!error) {
[audioRecorder prepareToRecord];
if (!audioRecorder.recording) {
[audioRecorder record];
}
} else {
NSLog(@"Create Error: %@", [error localizedDescription]);
}
}
这里是创建字典:
- (void) setDefaultSettings {
audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:AVAudioQualityMin],
AVEncoderAudioQualityKey,
[NSNumber numberWithInt:16],
AVEncoderBitRateKey,
[NSNumber numberWithInt:2],
AVNumberOfChannelsKey,
[NSNumber numberWithFloat:44100.0],
AVSampleRateKey, nil];
}
录制完成后我设置:
[audioRecorder release];
audioRecorder = nil;
所以我可以在不释放整个类的情况下再次使用它。
【问题讨论】:
-
您的问题是什么?什么是“类变量”?使用访问器而不是 ivars 将使这一切更清晰,并避免您在
recordAudio:中的保留不足(正如 Nekto 所指出的)。 -
obj c 中的类范围变量是什么?
-
Objective-C 本身没有类变量。有静态变量,可以实现基本一样的东西。您的命名很不清楚
audioRecorder是一个实例变量,audioSettings是一个静态变量。最好对实例变量使用属性,对类(静态)变量使用类方法。
标签: objective-c cocoa-touch memory-leaks nsdictionary