我正在尝试使用this project这是我正在构建的iPhone应用程序的Objective-C的合成器。但是,我遇到了MHAudioBufferPlayer
课的问题。
在MHAudioBufferPlayer.m
class中,我为Use of undeclared identifier
,_gain
和_playing
收到了大量_audioFormat
个错误。这是有道理的,因为这些标识符永远不会在它们前面用下划线声明。但是,它们在MHAudioBufferPlayer.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;
}
答案 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名称/属性名称是相同的,可以使用没有前导'_'。
祝你好运。