Ios 基本访问器没有可见的@接口

Ios 基本访问器没有可见的@接口,ios,objective-c,macos,core-data,Ios,Objective C,Macos,Core Data,我试图为一个简单的瞬态属性实现一个getter方法。瞬态属性是全名属性。fullName=firstName+lastName的典型示例 我正在开发一个iOS应用程序(以防相关的东西在OSX上的工作方式有所不同) 在“掌握核心数据”WWDC 2010主题演讲之后,我为Person NSManagedObject子类创建了一个类别。在该类别中,我添加了以下方法: - (NSString *)fullName { [self willAccessValueForKey:@"fullName"]

我试图为一个简单的瞬态属性实现一个getter方法。瞬态属性是全名属性。fullName=firstName+lastName的典型示例

我正在开发一个iOS应用程序(以防相关的东西在OSX上的工作方式有所不同)

在“掌握核心数据”WWDC 2010主题演讲之后,我为Person NSManagedObject子类创建了一个类别。在该类别中,我添加了以下方法:

- (NSString *)fullName {

  [self willAccessValueForKey:@"fullName"];
  NSString *fullName = [self primitiveFullName];
  [self didACCessValueForKey:@"fullName"];

  if (fullName == nil) {
    fullName = [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
    [self setPrimitiveFullName:fullName];
  }
  return fullName;}
Person类是由Xcode自动创建的,具有fullName属性及其@dynamic实现

当我试图编译这个项目时,我得到一个关于这个类别的错误,它说“没有可见的@interface for'Person'声明选择器'primitiveFullName'”

为什么我在苹果的文档中说“例如,给定一个具有属性firstName的实体,核心数据会自动生成firstName、setFirstName:、primitiveFirstName和setPrimitiveFirstName:”?时会出现这个错误

该错误是编译错误,不是警告


我应该做一些特殊的事情来生成原语访问器吗?

primitiveFullName
setPrimitiveFullName
肯定会在运行时自动生成。但在编译时,编译器无法找到这些方法。要在调用这些方法时抑制编译错误,应该声明这些方法的原型

如果在2010年,Objective-C编译器只对调用那些未声明的方法发出警告。但在引入ARC之后,Objective-C编译器不允许调用此类未声明的方法

如下图所示:

@interface Person (PrimitiveAccessors)

- (NSString *)primitiveFullName;
- (void)setPrimitiveFullName:(NSString *)newName;

@end

@implementation Person (TransientProperties)

- (NSString *)fullName {
    [self willAccessValueForKey:@"fullName"];
    NSString *fullName = [self primitiveFullName];
    [self didAccessValueForKey:@"fullName"];

    if (fullName == nil) {
        fullName = [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
        [self setPrimitiveFullName:fullName];
    }
    return fullName;
}

@end

第一条关于您设计的评论不是对Q本身的回答,而是密切相关的:

您的实现是不方便的:如果您有一个计算属性,您应该计算它。你不应该储存它。如果更改了
firstName
lastName
会发生什么情况?是否也要将此属性的设置器覆盖为nil
fullName
?如果它是计算属性,请计算它

- (NSString*)fullName
{
  return [NSString stringWithFormat:@"%@ %@", [self valueForKey:@"firstName"], [self valueForKey:@"lastName"]];
}
完成了


这应该可以解决您的问题,因为它是一种不同的设计。但是,如果您想保留旧方法,可以使用
-primitiveValueForKey:
-setPrimitiveValue:forKey:

在我看来,您应该为Person类创建子类,并在该子类中覆盖全名的getter。非常感谢!我最后添加了“@property(非原子)primitiveFullName”和“@dynamic primitiveFullName”以避免警告。嗯,我不同意这种情况。另一种(Apple)方法避免在托管对象未更改时计算全名。但是,在保存更改后,它会这样做