0

我正在尝试使用这个项目,它是我正在构建的 iPhone 应用程序的 Objective-C 合成器。但是,我在MHAudioBufferPlayer上课时遇到了麻烦。

MHAudioBufferPlayer.m课堂上,我收到一堆关于、和的Use of undeclared identifier错误。这是有道理的,因为这些标识符从来没有在它们前面使用下划线声明。但是,它们在类中声明时没有下划线。_gain_playing_audioFormatMHAudioBufferPlayer.h

由于我是 Objective-C 的新手,所以我对此感到有些困惑。下划线是否表示要采取的特殊行动?它应该被翻译成self.gain,self.playing等吗?我怎样才能解决这个问题?或者这段代码只是错误的?

- (id)initWithSampleRate:(Float64)sampleRate channels:(UInt32)channels bitsPerChannel:(UInt32)bitsPerChannel packetsPerBuffer:(UInt32)packetsPerBuffer
{
    if ((self = [super init]))
    {
        _playing = NO;
        _playQueue = NULL;
        _gain = 1.0;

        _audioFormat.mFormatID         = kAudioFormatLinearPCM;
        _audioFormat.mSampleRate       = sampleRate;
        _audioFormat.mChannelsPerFrame = channels;
        _audioFormat.mBitsPerChannel   = bitsPerChannel;
        _audioFormat.mFramesPerPacket  = 1;  // uncompressed audio
        _audioFormat.mBytesPerFrame    = _audioFormat.mChannelsPerFrame * _audioFormat.mBitsPerChannel/8;
        _audioFormat.mBytesPerPacket   = _audioFormat.mBytesPerFrame * _audioFormat.mFramesPerPacket;
        _audioFormat.mFormatFlags      = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;

        _packetsPerBuffer = packetsPerBuffer;
        _bytesPerBuffer = _packetsPerBuffer * _audioFormat.mBytesPerPacket;

        [self setUpAudio];
    }
    return self;
}
4

3 回答 3

2

如果您使用的是 Xcode4.4 及更高版本附带的新编译器,那么对于您的每个属性,它都会创建一个以 _(下划线) 作为前缀的自动合成。

就像,如果你创建了@property.... playing;

然后编译器创建@synthesize playing=_playing;

如果您使用的是旧版本的 Xcode,则需要手动完成。

于 2013-04-15T16:51:05.687 回答
0

@synthesize 由 Xcode => 4.4 默认生成。如果您没有显式创建自己的 @synthesize 语句,则Xcode 为您创建的生成的私有实例变量 ivar 有一个前导下划线 ' '。向该属性发送消息时必须包含前导 ' '(通常是 UI 元素作为你的 controller.m 文件的出口)。

那是

@property 文本字段;

[_textField setStringValue:@"foo"]; 如果你不写'@synthesize'。

编译器为您完成了这项工作,并通过合成 getter/setter 生成了一个私有实例变量。约定是使私有 ivar 成为前导下划线前缀的属性名称。

或者

@synthesize 文本字段;@property 文本字段;[文本字段 setStringValue:@"foo"]; 如果您确实编写了自己的“@synthesize”或者是 < Xcode 4.4。

在这里,编译器没有为您完成,您的 ivar 名称/属性名称是相同的,并且可以在没有前导“_”的情况下使用。

祝你好运。

于 2013-04-16T20:10:04.510 回答
0

根据您使用的 XCode 版本和编译器,有不同的方法。我不知道您对 OOP 有多熟悉,如果您不熟悉,我建议您阅读一些有关 setter、getter 和对象的内容,因为它是您从现在开始所做的几乎所有事情的基础。

一些例子,老派风格,将创建一个 ivar。在您的 .h 中:

@interface TheViewController : UIViewController{
    NSString *theString;
}

有点新的风格,将在你的 .h 中创建 setter 和 getter。

@interface TheViewController : UIViewController

@property (nonatomic, weak) NSString *theString;

在您的 .m 文件中:

@implementation TheViewController

@synthesize theString = _theString;

可以通过 _theString 或 self.theString 访问

这样做的新方法。在您的 .h 文件中:

@property (nonatomic, weak) NSString *theString;

编译器将按照上述方式创建所有内容。

希望对您有所帮助。

于 2013-04-15T17:40:57.537 回答