我认为这是一个简单的问题,但我在某种程度上泄露了核心数据中的对象。我在核心数据中有一对一的简单关系。
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
但是,我觉得这不是正确的做法。如何实现此功能以确保内存不会泄露。
答案 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用于新项目。