【问题标题】:Objective C - Core Data memory management?Objective C - 核心数据内存管理?
【发布时间】:2011-07-30 09:32:58
【问题描述】:

1- 这些方法有什么问题吗 我正在释放对象?

2- 我的 dealloc 是否覆盖了 dealloc 对于 NSManagedObject?

3- 我是否需要超级甚至解除分配? 虽然我的对象是 NSManagedObject 类型和核心数据 ia 负责吗?

@interface MyClass : NSManagedObject

@property (nonatomic, retain) NSString *coreDataString;
@property (nonatomic, retain) NSNumber *coreDataNumber;
@property (nonatomic, retain) CoolObject *coolObject;

@end

.

@implementation MyClass
@dynamic coreDataString;
@dynamic coreDataNumber;
@synthesize coolObject;

- (void)dealloc
{
   [self.coolObject release];
}

@end

【问题讨论】:

    标签: iphone objective-c core-data memory-management


    【解决方案1】:
    1. 是的,你没有打电话给[super dealloc]
    2. 是的。
    3. 是的,您必须始终在您的 dealloc 方法结束时调用 [super dealloc]。否则内存将无法正确释放。

    【讨论】:

      【解决方案2】:

      您应该直接在成员变量上调用 release,而不是使用属性。你还应该调用 super dealloc。所以你的 dealloc 看起来像这样:

      - (void)dealloc
      {
          [coolObject release];
          coolObject = nil;
      
          [super dealloc];
      }
      

      否则,您可以将该属性设置为 nil,这将在必要时自动释放局部变量。首选上述方式,这样您就不会意外运行可能会覆盖属性设置器的复杂函数。

      【讨论】:

      • 我最近在苹果园区的一次演讲中,他们建议使用 [coolObject release]; coolObject = nil; 而不是使用 setter 将其值设置为 nil。
      • 哦,有趣,他们有说为什么吗?我实际上大部分时间都是自己做的,但我认为我违背了他们的建议。主要是因为我喜欢不将所有变量都声明为属性时的一致性。
      • 我只是在文档中查找了它,实际上他们确实说您应该在本地实例上调用 release。将其设置为 nil 的唯一原因是防止在 dealloc 函数中多次意外地使用相同的变量(在 nil 对象上调用 release 不会做任何事情),因此这样做更安全。我会将上面的代码更新为首选方法。
      • 原因:setter 可以运行使用其他对象的代码。如果这些使用的对象在您调用 setter 之前被释放,您的代码将崩溃。在 init 和 dealloc 中,对象(self)可能处于无效状态。这就是为什么你不应该在 init 或 dealloc 中使用 setter。
      【解决方案3】:

      您应该始终在 dealloc 方法中调用 [super dealloc]。但是在 NSManagedObject 的子类中,你根本不应该使用 dealloc 方法。改用 - (void)didTurnIntoFault。

      【讨论】:

        【解决方案4】:

        您正在覆盖父母 - (void)dealloc 方法。当您覆盖父对象的方法时,父对象的方法永远不会被调用,直到您显式调用父对象的方法。在您的情况下,不会调用父母的 - (void)dealloc 。要解决此问题,您必须调用 [super dealloc] 以确保父实例变量也被释放。

        【讨论】:

          猜你喜欢
          • 2011-03-15
          • 1970-01-01
          • 2020-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-13
          • 2015-03-02
          相关资源
          最近更新 更多