После установки одного объекта NSManaged на другой, возвращается Null - PullRequest
0 голосов
/ 08 февраля 2011

Я пытаюсь передать выбранный объект в моих coredata из rootviewcontroller в представление редактирования.Выбранный объект передается, но затем становится нулевым после вызова theObject = selectedObject .Кто-нибудь знает, что я делаю неправильно?

Это в edit.h

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#import "LearningAppDelegate.h"
@interface edit : UIViewController <UITextViewDelegate, UITableViewDelegate, UITableViewDataSource, UIActionSheetDelegate>{
UITableView *tableView;
NSManagedObject *theObject;
UITextView *messageView;
}
@property(nonatomic, retain) IBOutlet UITableView *tableView;
@property(nonatomic, retain) IBOutlet UITextView *messageView;
@property(nonatomic, retain) NSManagedObject *theObject;
-(id)initWithObject:(NSManagedObject *)selectedObject;
@end

Это в edit.m:

-(id)initWithObject:(NSManagedObject *)selectedObject {
        self = [super init];
        if (nil == self) {
            return nil;
        }
        NSLog(@"selectedObject: %@", selectedObject);
        NSLog(@"selecetedObject.message: %@", [[selectedObject valueForKey:@"message"] description]);
        theObject=selectedObject;
        NSLog(@"theObject 1: %@", theObject);
        NSLog(@"theObject.message 1: %@", [[theObject valueForKey:@"message"] description]);
        return self;
    }

    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {
        NSLog(@"theObject 2: %@", theObject);
        NSLog(@"theObject.message 2: %@", [[theObject valueForKey:@"message"] description]);
        messageView.text=[[theObject valueForKey:@"message"] description];
        [super viewDidLoad];
    }

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Я на самом деле поражен тем, что не падает для вас.Вы назначаете переменную selectedObject в переменную экземпляра theObject, не сохраняя ее для собственного использования.Получая доступ к переменной экземпляра непосредственно в присваивании 'theObject = selectedObject', вы обходите поведение, предоставляемое объявлением @property.Это означает, что после того, как selectedObject наконец будет освобожден, объект будет указывать на мусорную память.

Правильный способ сделать это - поместить theObject = [selectedObject retain];в -initWithObject: метод и в -viewDidLoad для доступа к нему через self.theObject, а не только через theObject.

В моем собственном использовании я предпочитаю давать имена переменных экземпляра, отличные от реального имени свойства, чтобы избежать путаницы.Например:

@interface SomeClass : NSObject
{
    @private
    NSManagedObject *_theObject;
}

@property (nonatomic, retain) NSManagedObject *theObject;

...

@end


@implementation SomeClass
@synthesize theObject = _theObject

...

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

@end
0 голосов
/ 08 февраля 2011

У меня есть опыт работы только с Coredata на рабочем столе, но проблема выглядит так, как будто бы это был метод initWithObject.Ни в коем случае вы фактически не вставляете новый объект в контекст управляемого объекта.Вы должны использовать этот метод для создания новых объектов:

- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context

Например, в псевдокоде:

NSManagedObject *newObject = [[NSManagedObject alloc] initWithEntity:NSENTITYDESCRIPTION insertIntoManagedObjectContext:MANAGEDOBJECTCONTEXT];
[newObject setValue:@"VALUE_OF_SELECTED_OBJECT" forKey:@"APPROPRIATE_KEY"];
//REPEAT AS NECESSARY
[MANAGEDOBJECTCONTEXT save];

* Код не проверен, соглашения об именах игнорируются и т. Д.

Сохранение важно.Если вы этого не сделаете, объект не будет сохраняться.

...