无法设置成员变量两次(NSManagedObject)

时间:2011-05-31 07:57:41

标签: iphone objective-c memory-management nsmanagedobject

尝试在第二次的NSManagedObject的子类中设置值时,我收到EXC_BAD_ACCESS错误。

我正在使用僵尸,但控制台中没有任何内容出现。使用GDB打印出对象我看到对象在我尝试设置值时都有相同的内存地址 - 不知道为什么会这样。

场合

  1. 我有一个视图(A),当扫描QR码时,添加一个子视图(B),然后下载XML,然后将其保存到子类NSManagedObject中。
  2. 在子视图(B)中,我向后导航(removeFromSuperView被调用)
  3. 返回原始视图(A)
  4. 下次,当扫描相同的 QR码时,它(A)从数据库中找到NSManagedObject并将其附加到新视图(与B类型相同)的实例变量上然后作为子视图添加到原始(A)。
  5. 在视图B的viewDidLoad中,我总是尝试设置当前日期,以便跟踪用户“看到”该对象的时间。 这是我收到EXC_BAD_ACCESS错误的地方

        self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
    

    其中self.currentPiece是当数据库中存在该对象时附加在A中的子类NSManagedObject的实例。

    我知道它正在某个地方发布,但我不知道自从托管对象自己处理大部分内容以来。该错误仅在我尝试设置值时第二次出现。

    我试图明确这一点。请告诉我你是否希望我更多地澄清它。 感谢您的帮助(现在已经工作了几个小时)

    更新

    在HubPiece.h中声明piece_last_viewed:

    @interface HubPiece : NSManagedObject {
    
    }
    
    // ...
    
    @property (nonatomic, retain) NSNumber *piece_last_viewed;
    

    HubPiece.m:

    @dynamic piece_last_viewed;
    
    //...inside init method:
    
    self.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
    

    更新2:

    这不是由于子视图的切换,这被排除了。然后我意识到我也没有保存我的更改,所以我在子类NSManagedObject中引入了save:。我第一次尝试保存实体实例(在应用程序会话期间保存,但是如果我完全退出应用程序,然后再次打开它,则数据消失),我得到了一个早期错误。所以我认为使用[context save:&error]会是一个好主意:) ...但现在这不起作用并给我一个EXC_BAD_ACCESS错误。

    HubPiece本身是从另一个类HubPieceView.m初始化的:

    self.currentPiece = [[HubPiece alloc] initWithXML:pieceXML];
    

    self.currentPiece是类型HubPiece的类变量,它首先在.h文件中声明,然后在.m文件中合成。

    然后在HubPiece.m内,初始值设定项如下所示:

    -(id)initWithXML:(TBXMLElement *)pieceXML
    {
        // Setup the environment for dealing with Core Data and managed objects
        HenryHubAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        NSEntityDescription *entityHubPiece = [NSEntityDescription entityForName:@"HubPiece" 
                                                          inManagedObjectContext:context];
    
        // STORING values
        self = [[HubPiece alloc] initWithEntity:entityHubPiece insertIntoManagedObjectContext:context];
    
        // ...setting variables with normal assignment: self.var = value;
    
        NSError *error;
    
        // Save fails
        if (![context save:&error] ){
            NSLog(@" ERROR: %@", [error localizedDescription]);
        }
    
        return self;
    }
    

1 个答案:

答案 0 :(得分:0)

我刚刚意识到自己的问题。我通过正常的'='赋值给实体赋值:

self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];

什么时候应该完成:

[self setCurrentPiece.piece_last_viewed:[[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]] ];

这是因为它是一个托管对象,它通过@dynamic编译器指令在运行时创建自己的访问器。