Передача объекта между классами не работает - PullRequest
0 голосов
/ 06 мая 2011

Эй, ребята, Я новичок в объективе-C и у меня проблемы с управлением памятью. я объявил 3 класса, Table, Dataset и мой основной класс. В моем основном классе я создал объект набора данных, и теперь я пытаюсь передать этот объект объекту таблицы, где я хочу сохранить его постоянно. но мне кажется, что сборщик мусора убивает ссылку, прежде чем я смогу ее использовать.

вот какой-то код:

Dataset:

    //Dataset.h
@interface Dataset : NSObject {
    NSMutableArray* daten; 
}

@end

//Dataset.m
#import "Dataset.h"
#import "Datensatz.h"

@implementation Dataset


- (id) init
{
    self=[super init];
    daten=[[NSMutableArray alloc] init];
    return self;
}

Таблица:

//Table.h

@class Dataset;

@interface Table : NSObject {
    Dataset* daten;
}
-(id)init:(NSTableView *)aTableView;
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex;
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView;
@property (retain) Dataset* daten;

@end

//Table.m

#import "Table.h"
#import "Dataset.h"
@impl

ementation Table

    @synthesize daten;

    -(id)init:(NSTableView*)aTableView
    {
        self=[super init];
        [self setDaten:[Datenmenge alloc]];
        return self;
    }
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
    NSLog(@"anzahl: %d %@",[self.daten anzahl], self.daten);//This is always 0 null
    return [daten anzahl];

}
    -(void)setDaten:(Dataset *)a
    {
        NSLog(@"setter: anzahl: %d %@",[a anzahl], a);
        [daten release];
        daten=[a retain];
        NSLog(@"setter: anzahl: %d %@",[daten anzahl], daten);
    }
    @end

В моем основном классе я делаю следующее:

  //init method
    [self setDaten:[[[Dataset alloc]init]autorelease]];
    tabelle=[[Table alloc] init:tableview];
    [tabelle setDaten:[self daten]];

MainClass:

//code.h
//
//  MalWiederWasNeuesAppDelegate.h
//  MalWiederWasNeues
//
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import <Cocoa/Cocoa.h>
@class Datenmenge,Graph,Tabelle;

@interface MalWiederWasNeuesAppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    NSToolbarItem *datenKnopf;
    NSToolbarItem *speichernKnopf;
    NSSlider *scaleSlider;
    NSScroller *moveSlider;
    NSTableView* tableview;
    Graph* graph;
    Tabelle* tabelle;
    Datenmenge* daten;

}

-(void)tuWas;

- (IBAction)datenHinzufuegen:(id)sender;
- (IBAction)speichern:(id)sender;

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSToolbarItem *datenKnopf;
@property (assign) IBOutlet NSToolbarItem *speichernKnopf;
@property (assign) IBOutlet NSSlider *scaleSlider;
@property (assign) IBOutlet NSScroller *moveSlider;
@property (assign) IBOutlet Graph *graph;
@property (assign) IBOutlet Tabelle *tabelle;
@property (assign) IBOutlet NSTableView* tableview;
@property (retain) Datenmenge* daten;
@end

//code.m
//
//  MalWiederWasNeuesAppDelegate.m
//  MalWiederWasNeues
//
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "MalWiederWasNeuesAppDelegate.h"
#import "Datenmenge.h"
#import "Graph.h"
#import "Tabelle.h"
@implementation MalWiederWasNeuesAppDelegate

@synthesize window;
@synthesize daten;
-(id) init
{
    self.daten=[[Datenmenge alloc]init];
    [self.daten datenHinzufuegen:nil];
    tabelle=[[Tabelle alloc] init:tableview];
    tabelle.daten=daten;

    NSLog(@"konstruktor: %f %d",[daten maximum],[daten anzahl]);
    //graph.daten=daten;

    return self;
}

-(void)tuWas{

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application 
}

- (IBAction)datenHinzufuegen:(id)sender
{
    NSLog(@"%f %d",[daten maximum],[daten anzahl]);
    NSLog(@"daten hinzufügen");
}

- (IBAction) speichern:(id)sender
{
    NSLog(@"%@ %@",daten,[tabelle daten]);
    NSLog(@"speichern");    
}

@end

Надеюсь, это был не слишком большой код для вас. когда я вызываю метод "tabelle", мой объект Table, "daten", не ссылается на объект набора данных. Но NSLogs в "setDaten" показывают мне действительные ссылки. Итак, что я делаю не так?

хорошего вечера, Lukas

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Вы определяете Daten как тип сохранения

@property (retain) Dataset* daten; и @synthesize daten;

Нет необходимости реализовывать метод

-(void)setDaten:(Dataset *)a вот что @synthesize daten; делает

Я думаю, что здесь есть потерянный момент перевода, поэтому я не могу предположить, что Table == Tabelle и Dataset == Datmenge, и я не вижу реализации вашего основного класса.

брось свой взгляд на это тоже.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

0 голосов
/ 06 мая 2011

Может быть, свойство daten вашего основного класса объявлено как assign? В этом случае daten корректен при вызове setDaten:, но, возможно, уже был автоматически выпущен при попытке доступа к нему впоследствии.

Кроме того,

-(void)setDaten:(Dataset *)a
{
    NSLog(@"setter: anzahl: %d %@",[a anzahl], a);
    [daten release];
    daten=[a retain];
    NSLog(@"setter: anzahl: %d %@",[daten anzahl], daten);
}

не очень хорошая реализация сеттера. Если == daten, то этот объект будет освобожден (и, возможно, dealloc'd). Вам нужно проверять идентичность объектов при реализации вашего собственного установщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...