创建一个临时的关系属性

时间:2012-09-11 14:11:08

标签: objective-c ios core-data

我认为这是一个简单的问题,但我在某种程度上泄露了核心数据中的对象。我在核心数据中有一对一的简单关系。

       Person           <-------->         Address

        -name                                -city
        -email                               -country

人物模型相对简单,只有很少的属性。但是,我想在Person类中添加getter来从person类本身访问city和country。所以,我做了类似的事情,

@interface Person:NSManagedObject
    @property(nonatomic, strong) NSString *name;
    @property(nonatomic, strong) NSString *email;
    @property(nonatomic, strong) Address *address;
    -(NSString*)city;
    -(NSString*)country;
@end


@implementation Person
  -(NSString*)city{
     [self willAccessValueForKey:@"address"];
     NSString *c = [self valueForKeyPath:@"address.city"];
     [self didAccessValueForKey:@"address"];
   }

   -(NSString*)country{
     [self willAccessValueForKey:@"address"];
     NSString *c = [self valueForKeyPath:@"address.country"];
     [self didAccessValueForKey:@"address"];
   }

@end

借助这些吸气剂,我可以在Person模型中使用简单的getter访问城市;

    person.city   and  person.country

但是,我觉得这不是正确的做法。如何实现此功能以确保内存不会泄露。

3 个答案:

答案 0 :(得分:1)

您无法直接从人访问城市或国家/地区, 你可以访问....

Person.Address.city
Person.Address.country

并且无需实现:

-(NSString*)city;
-(NSString*)country;

答案 1 :(得分:1)

您忘记了代码中的return语句,但我猜它们在您使用的实际代码中。

我没有看到代码本身有任何泄漏。但请记住,当核心数据关系固有地创建保留周期时,您负责完成所有操作。见Core Data And Retain Cycles

答案 2 :(得分:1)

正如Ganee所说,你可以访问

person.address.city

但如果您绝对需要city方法,则应使用生成的属性:

- (NSString*)city {
    return address.city;
}

虽然这会隐藏您的关系访问权限,但请确保这是您想要的。

关于你的内存泄漏,你需要一个非常,非常非常好的理由不将ARC用于新项目。