0

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

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

        -name                                -city
        -email                               -country

人物模型相对简单,只有几个属性。但是,我想在 Person 类中添加 getter 以从 person 类本身访问城市和国家。所以,我做了类似的事情,

@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

有了这些 getter,我就可以通过 Person 模型中的简单 getter 访问城市;

    person.city   and  person.country

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

4

3 回答 3

1

您不能直接从 Person 访问城市或国家/地区,您可以访问...

Person.Address.city
Person.Address.country

并且不需要实施:

-(NSString*)city;
-(NSString*)country;
于 2012-09-11T14:30:32.213 回答
1

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

我没有看到代码本身有任何泄漏。但是请记住,您有责任在完成时对所有事情负责,因为核心数据关系会固有地创建保留周期。查看核心数据和保留周期

于 2012-09-11T16:12:02.913 回答
1

正如 Ganee 所说,您可以访问

person.address.city

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

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

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

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

于 2012-09-11T16:14:39.870 回答