使用未声明的标识符

时间:2013-04-15 16:42:46

标签: iphone ios objective-c audiotoolbox

我正在尝试使用this project这是我正在构建的iPhone应用程序的Objective-C的合成器。但是,我遇到了MHAudioBufferPlayer课的问题。

MHAudioBufferPlayer.m class中,我为Use of undeclared identifier_gain_playing收到了大量_audioFormat个错误。这是有道理的,因为这些标识符永远不会在它们前面用下划线声明。但是,它们在MHAudioBufferPlayer.h中声明,而不是下划线。

由于我是Objective-C的新手,我对此感到困惑。下划线表示要采取特殊措施吗?它应该被翻译成self.gainself.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;
}

3 个答案:

答案 0 :(得分:2)

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

比如,如果您已创建@property.... playing;

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

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

答案 1 :(得分:0)

根据您使用的XCode版本和编译器,有不同的方法。我不知道你对OOP有多熟悉,如果你不是我建议你读一下定制者,吸气剂和物品,因为它是你从现在开始几乎所有事情的基础。

一些例子,老派风格,将创造一个伊娃。在你的.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;

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

希望对你有所帮助。

答案 2 :(得分:0)

由Xcode生成的@synthesize => 4.4作为默认值。如果您没有显式创建自己的@synthesize语句,则由Xcode为您创建的生成的私有实例变量ivar具有前导下划线“”。在向此发送消息时,您必须包含前导'' property(通常是UI元素作为来自controller.m文件的插座)。

那是

@property textField;

[_ textField setStringValue:@“foo”];如果你不写'@synthesize'。

编译器为您完成此操作,并通过合成getter / setter创建了一个私有实例变量。惯例是使私有ivar成为前导下划线前面的属性名称。

OR

@synthesize textField; @property textField; [textField setStringValue:@“foo”];如果你自己写'@synthesize'或者是< Xcode 4.4。

这里,编译器没有为你完成,你的ivar名称/属性名称是相同的,可以使用没有前导'_'。

祝你好运。