Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Can';两次设置成员变量(NSManagedObject)_Iphone_Objective C_Memory Management_Nsmanagedobject - Fatal编程技术网

Iphone Can';两次设置成员变量(NSManagedObject)

Iphone Can';两次设置成员变量(NSManagedObject),iphone,objective-c,memory-management,nsmanagedobject,Iphone,Objective C,Memory Management,Nsmanagedobject,第二次尝试在NSManagedObject的子类中设置值时,我遇到EXC_BAD_访问错误 我正在使用僵尸,但控制台中没有显示任何内容。使用GDB打印出该对象时,我在尝试设置该值的两次操作中都看到该对象具有相同的内存地址,但不确定原因 情况: self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]]; 我有一个视图(a),当扫

第二次尝试在NSManagedObject的子类中设置值时,我遇到EXC_BAD_访问错误

我正在使用僵尸,但控制台中没有显示任何内容。使用GDB打印出该对象时,我在尝试设置该值的两次操作中都看到该对象具有相同的内存地址,但不确定原因

情况

    self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
  • 我有一个视图(a),当扫描二维码时,会添加一个子视图(B),该子视图会下载XML,然后将XML保存到子类NSManagedObject中
  • 在子视图(B)中,我向后导航(
    removeFromSuperView
    被调用)
  • 回到原始视图(A)
  • 下次扫描相同的QR代码时,它(A)会从数据库中找到NSManagedObject,并将其附加到新视图(与B类型相同)上的实例变量,然后将其作为子视图添加到原始视图(A)中
  • 在视图B的
    viewDidLoad
    中,我总是尝试设置当前日期,以便跟踪用户何时“看到”该对象这是我得到EXC\u BAD\u访问错误的地方

        self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
    
    其中,
    self.currentPiece
    是在数据库中存在子类NSManagedObject时附加到的子类NSManagedObject的实例

    我知道它是在某个地方发布的,但我不知道在哪里,因为托管对象自己负责大部分工作。该错误仅在我尝试设置该值的第二次出现

    我已经试图把这一点讲清楚。如果你想让我进一步澄清,请告诉我。 感谢您的帮助(已经为此工作了几个小时)

    更新:

    声明最后一次在Hubbice.h中查看的片段:

    @interface HubPiece : NSManagedObject {
    
    }
    
    // ...
    
    @property (nonatomic, retain) NSNumber *piece_last_viewed;
    
    Hubbece.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\u BAD\u访问错误

    轮毂本身是从另一个类初始化的
    hubbieview.m

    self.currentPiece = [[HubPiece alloc] initWithXML:pieceXML];
    
    self.currentPiece
    hubbece
    类型的类变量,它首先在.h文件中声明,然后在.m文件中合成

    然后在
    hubbece.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;
    }
    

    我刚刚意识到我的问题。我一直在通过正常的“=”赋值为实体赋值:

    self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];
    
    应在何时完成:

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

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

    在第二次按B之前,currentPiece的值是否正确填充且完整?最后一次查看是如何申报的?在按下视图B之前,您是否可以设置最后一次查看的工件(只是为了尝试将视图B隔离为问题的根源。)谢谢您的评论,我在按下B键之前设置了它,但没有任何帮助,所以我现在将其隔离为在不允许的情况下设置变量。如何声明工件上次查看?在设置工件上次查看和第二次查看之间是否存在获取或保存操作,或者您只是在使用最初获取的轮毂?另外,为什么要使用NSNumber而不是NSDate?核心数据确实有一个日期字段,所以您可以只使用myEntity.myDateField=[NSDate date];以捕获当前日期。