Эй, ребята,
Я новичок в объективе-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