使用ARC时,在视图之间正确传递NSManagedObjects?记忆警告&紧急

时间:2012-02-11 08:05:44

标签: objective-c ios core-data memory-management automatic-ref-counting

嗨,我在ARC下有一个讨厌的内存管理问题,无法弄清楚如何解决它。问题就像这样,我有这些对象:

ObjectManager - 对核心数据执行fetchRequests并获取一个或多个NSManagedObjects的单例

UIViewControllerA - 一个视图控制器,其中有一个按钮“PassManagedObject”和一个声明如下的属性:

@property (strong, nonatomic) ManagedObject *objectForToday;
在UIViewControllerA 上的 viewDidLoad 中,我调用方法 refreshDailyObject 执行此操作:

self.objectForToday = nil;
self.objectForToday  = [[ObjectManager sharedManager] getDailyObject];

如果我点击 PassManagedObject 按钮我创建UIViewControllerB 传递 objectForToday 到它并显示,见下文

- (IBAction)passManagedObjectTapped:(id)sender {
       UIViewControllerB *viewController = [[UIViewControllerB alloc] initWithNibName:@"UIViewControllerB"];
       viewController.object = self.objectForToday;
       [self.navigationController pushViewController:viewController animated:NO];
 }

UIViewControllerB 有一个声明如下的属性:

@property (strong, nonatomic) ManagedObject *object;

和“后退”按钮执行此操作:

- (IBAction)backAction:(id)sender {
    self.object = nil;
    [self.navigationController popViewControllerAnimated:NO];
}

现在的问题是这个。如果我连续点击passManagedObjectTapped然后再点击backAction,再次传递ManagedObjectTapped并再次使用backAction,然后再次传递ManagedObjectTapped并自动执行此操作,我最终会收到内存警告1 ,然后崩溃

仪器没有显示任何泄漏,但我的内存分配持续缓慢上升。

我在iOS4.3和iOS下使用 ARC iOS5的。我一直在努力弄清楚现在一天出了什么问题。任何帮助将受到高度赞赏。

谢谢!

1 个答案:

答案 0 :(得分:5)

self.object = nil;和self.objectForToday = nil;没有必要 - ARC和合成的属性设置者已经处理过这个问题。

你似乎很可能在某个地方有一个循环引用。在任何情况下,对象A对对象B有强引用,对象B对对象A有强引用吗?

如果是这样,只需将其中一个引用更改为weak(或者如果要支持iOS 4.3,则分配)。