メンバー変数を2回設定することはできません(NSManagedObject)

iphone memory-management nsmanagedobject objective-c
メンバー変数を2回設定することはできません(NSManagedObject)

NSManagedObjectのサブクラス内で_second time_に値を設定しようとすると、EXC_BAD_ACCESSエラーが発生します。

ゾンビを使用していますが、コンソールに何も表示されません。 GDBを使用してオブジェクトを印刷すると、値を設定しようとするたびにオブジェクトのメモリアドレスが同じであることがわかりますが、理由はわかりません。

状況

  1. QRコードがスキャンされたときにサブビューを追加するビュー(A)があります(B)
    次に、XMLをダウンロードし、サブクラス化されたNSManagedObjectに保存します。

  2. サブビュー内(B​​)に戻ります( `removeFromSuperView`は
    と呼ばれる)

  3. 元のビューに戻る(A)

  4. 次回、same QRコードがスキャンされると、(A)は
    NSManagedObjectをデータベースから取得し、それを新しいビュー(Bと同じタイプ)のインスタンス変数にアタッチし、それを元のサブビュー(A)に追加します。

ビューBの `viewDidLoad`では、ユーザーがそのオブジェクトを「見た」ときを追跡するために、常に現在の日付を設定しようとします。 ここでEXC_BAD_ACCESSエラーが発生します

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

ここで、「self.currentPiece」は、そのオブジェクトがデータベースに存在したときにAでアタッチされたサブクラス化されたNSManagedObjectのインスタンスです。

私はそれがどこかでリリースされていることを知っていますが、マネージドオブジェクトがそれの大部分を自分で処理するので、どこでそれを知りません。 エラーは、値を設定しようとするときに2回だけ発生します。

これを明確にしようとしました。 さらに明確にしたい場合は教えてください。 助けてくれてありがとう(今数時間これに取り組んでいる)

更新:

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;
}

  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`コンパイラ命令を使用して独自のアクセサを作成する管理対象オブジェクトであるためです。

0


タイトルとURLをコピーしました