2012-09-11 67 views
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.city and person.country 

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

回答

1

你不能在人与人之间直接接入城市或国家, 您可以访问像....

Person.Address.city 
Person.Address.country 

,并没有必要的落实:

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

不,我有一些需要访问该值的情况。我正在做的方式正确地获取值,但这种方法存在一些泄漏。 – Sandeep

1

你忘了return语句在代码中,但我想他们在你使用的实际代码中。

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

1

由于Ganee说,你可以访问

person.address.city 

,但如果你确实需要城市的方法,你应该使用生成的属性:

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

虽然这个隐藏的关系访问所以请确保这就是你想要的。

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