Ios 对于';没有可见的@界面;二进制文件读取器';声明选择器';initWithLocation:&x27;

Ios 对于';没有可见的@界面;二进制文件读取器';声明选择器';initWithLocation:&x27;,ios,objective-c,file-io,Ios,Objective C,File Io,我遇到了一个错误: “BinaryFileReader”没有可见的@interface声明选择器“initWithLocation:” 对于以下方法中在BinaryFileReader上调用的每个方法 + (Item*)loadItem:(NSString*)filepath { Item* newItem = [[Item alloc] init]; BinaryFileReader* input = [[BinaryFileReader alloc] initWithLocation

我遇到了一个错误:

“BinaryFileReader”没有可见的@interface声明选择器“initWithLocation:”

对于以下方法中在BinaryFileReader上调用的每个方法

+ (Item*)loadItem:(NSString*)filepath {
  Item* newItem = [[Item alloc] init];
  BinaryFileReader* input = [[BinaryFileReader alloc] initWithLocation:filepath];
  [newItem setName:[input readNSString]];
  [newItem setOtherNames:[input readNSMutableArrayOfNSString]];
  [newItem setDescription:[input readNSString]];
  [newItem setXactCode:[input readNSString]];
  [newItem setSymbilityCode:[input readNSString]];
  [newItem setAverageLowPrice:[input readInt]];
  [newItem setAverageHighPrice:[input readInt]];
  [newItem setAverageLifeExpectancy:[input readInt]];
  return newItem;
}
这是我的BinaryFileReader.m:

#import "BinaryFileReader.h"

@implementation BinaryFileReader

- (id)init {
  self = [super init];
  return self;
}

- (id)initWithLocation:(NSString*)filepath {
  if ((self = [super init])) {
      _file = [NSFileHandle fileHandleForReadingAtPath:filepath];
      _fileOffset = 0;
      if (_file == nil)
          NSLog(@"%@%@",@"Failed to open file at path:",filepath);
  }
  return self;
}

- (void)close {
  [_file closeFile];
}

- (int)readInt {
  [_file seekToFileOffset:_fileOffset];
  _databuffer = [_file readDataOfLength:4];
  _fileOffset+=4;
  return (*(int*)([_databuffer bytes]));
}
- (NSString*)readNSString {
  int length = [self readInt];
  [_file seekToFileOffset:_fileOffset];
  _databuffer = [_file readDataOfLength:length];
  _fileOffset+=length;
  return [[NSString alloc] initWithData:_databuffer encoding:NSUTF8StringEncoding];
}

- (NSMutableArray*)readNSMutableArrayOfNSString {
  NSMutableArray* array = [[NSMutableArray alloc] init];
  int arrayLength = [self readInt];
  int length;
  for (int i=0; i<arrayLength; i++) {
      length = [self readInt];
      [_file seekToFileOffset:_fileOffset];
      _databuffer = [_file readDataOfLength:length];
      _fileOffset+=length;
      [array addObject:[[NSString alloc] initWithData:_databuffer encoding:NSUTF8StringEncoding]];
  }
  return array;
}

@end

我不明白我为什么会有这个问题。如果您能帮我澄清,我将不胜感激。

我将您问题中的代码复制粘贴到我的一个项目中。预期结果:一切正常。所以问题肯定不是你的代码

回到另一个
BinaryFileReader.h
污染导入的想法:您在项目中使用过任何第三方库吗?如果是,其中一个可能会意外地提供一个
BinaryFileReader.h
文件


尝试以下操作:将
BinaryFileReader.h
重命名为其他名称,例如
Foo.h
。同时将
BinaryFileReader.m
中的#导入更改为使用
Foo.h
,但将#导入保留在
loadItem:
方法所在的文件中,以便它仍然使用
BinaryFileReader.h
。现在再次编译。编译器现在应该抱怨找不到
BinaryFileReader.h
。如果错误仍然与缺少选择器有关,那么您知道在某个地方出现了意外的
BinaryFileReader.h
使您的项目一团糟。

我不知道这是否是个问题,但是为什么您的init方法的返回类型是
id
?因为它是。忘记在触发错误的文件中包含BinaryFileReader头了?我看不出您发布的代码有任何问题。发布整个文件可能会有用。我确实发布了所有内容。。。您的意思是发布+(Item*)loadItem所属的文件吗?还要揭穿语句“忘记包含BinaryFileReader头,我有#import”BinaryFileReader.h“它确实抱怨BinaryFileReader.h不存在。@我必须承认失败。我能给出的唯一其他建议是:复制你的项目,删除所有内容,除了涉及的3个文件。如果这个超简约的项目仍然存在编译器错误,那么你可以将这个迷你项目上传到某个地方让我们看看。好的,那么。。。我把它修好了……差不多。我所做的是,在重命名它之后,我将#import in Item.m从#import BinaryFileReader.h更改为#import Foo.h,并将所有对Foo的引用。。。然后我跑过去,很好地遵守了它。“BinaryFileReader”这个名字显然有问题,对吧?这正是我所想的,但在将所有内容从Foo更改回BinaryFileReader后,它工作得很好。总结-我不知道这个幻影错误是关于什么的,它让我一天的工作落后了1/2,但是@Herzube你给了我最终导致解决方案的答案,所以这里有最好的答案。@Hoodai确实很奇怪。不知何故,Xcode或其他Xcode一定缓存了一个旧版本的
BinaryFileReader.h
,但它是如何缓存的(预编译头?)我无法理解。很高兴听到你现在回到了正轨,谢谢你接受了答案。
@interface BinaryFileReader : NSObject

@property (nonatomic) int fileOffset;
@property (nonatomic, retain) NSData* databuffer;
@property (nonatomic, retain) NSFileHandle* file;

- (id)init;
- (id)initWithLocation:(NSString*)filepath;
- (void)close;
- (int)readInt;
- (NSString*)readNSString;
- (NSMutableArray*)readNSMutableArrayOfNSString;

@end