• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Daten wollen nicht ins NSMutableArray

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,

heute morgen hab ich freundlicher weise von euch erfahren wie ich Attribute in anderen klassen nutze.
nun zeigt mein Programm aber ein echt merkwürdiges verhalten.

Also ich habe zwei Klassen OldViewViewController und NewView.
In der OldViewViewController.h habe ich ein Array (listItems) definiert.
Dieses nutze ich in der NewView. Wenn ich jetzt das Array befüllen will,
gibts es zwar keinen Fehler aber das Array bleibt leer.

Analog habe ich habe ich ein zweites TestArray in der NewView.h definiert.
Wenn ich dieses mit Daten fülle geht es. (Habe das mit NSLog geprüft, die Daten sollen
später in eine Tabelle)


Hier mal der Code von der NewView.m
Code:
#import "NewView.h"
#import "OldViewViewController.h"

@implementation NewView
@synthesize oldViewObject;

- (void)viewDidLoad 
{
    [super viewDidLoad];
         
    oldViewObject.listItems = [[NSMutableArray alloc] init];
    [oldViewObject.listItems addObject:@"blabla"];
    
    testArray = [[NSMutableArray alloc] init];
    [testArray addObject:@"testArray"];
    
    NSLog(@"ListItems: %@", oldViewObject.listItems);
    NSLog(@"New Array: %@", testArray);
}

Warum bleibt das Array listItems leer?
Bei dem anderen gehts doch.
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Mal raten.
Hast Du vielleicht die Accessors vergessen?
Und sollte listItems nicht schon initialisiert sein?
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Ok ich weiß jetzt nicht genau was du mit Accesores meinst, aber die habe ich bei dem anderen Array garantiert auch nicht.
Habe die listItems jetzt in der Klasse initialisiert aus der sie ursprünglich kommen... klappt aber immer noch nicht.
Der Unterschied zwischen den beiden Arrays ist ja nur das das testArray in der NewView.h definiert wurde und das
listItemArray in der OldViewViewController.h
Auch auf die Gefahr hin das ich euch langweile poste ich mal den Code von der NewView.h auch wenn da nix dolles drin steht.
Code:
#import <UIKit/UIKit.h>
#import "OldViewViewController.h"

@interface NewView : UITableViewController 
{
    OldViewViewController *oldViewObject;
    
    NSMutableArray *testArray;
}
@property(nonatomic, retain) OldViewViewController *oldViewObject;

@end
und hier noch die OldViewViewController.h
Code:
#import <UIKit/UIKit.h>

@interface OldViewViewController : UIViewController 
{
    NSMutableArray *listItems;
    
    IBOutlet UITextField *textField;
    IBOutlet UIButton *newViewButton;

}
@property(nonatomic, retain) NSMutableArray *listItems;
-(IBAction)buttonPressed:(id)sender;

@end
Ich weiß absolut nicht warum das listItem-Array immer NULL ist.
Kann mir da jemand helfen?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Auch auf die Gefahr hin das ich euch langweile poste ich mal den Code von der NewView.h auch wenn da nix dolles drin steht.
Erzeugst du denn auch eine Instanz von OldViewController bei der Initialisierung von NewView oder übergibst der NewView Instanz eine Instanz von OldViewController?

MacApple
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Ich erzeuge nur in der NewView.h eine Instanz von OldViewViewController, so wie es in dem Quellcodeabschnitt zu sehen ist.
In der NewView.m greife ich dann über die Instanz von OldViewViewController (oldViewObject) auf das Attribut listItems zu.
Ansonsten erzeuge ich an keiner anderen Stelle eine Instanz von OldViewViewController. Ich habe nicht mal eine Instanz von NewViewController..... bzw habe ich schon aber nur für andere Zwecke. Aber für die Befüllung des Arrays brauche ich ja auch gar keine Instanz von der NewView. oder sehe ich das falsch?
Hier mal nur der Vollständgkeit halber der Code von der OldViewViewControler.m aber ist nicht wirklich spannend.
Code:
#import "OldViewViewController.h"
#import "NewView.h"

@implementation OldViewViewController
@synthesize listItems;

-(IBAction)buttonPressed:(id)sender
{
    NewView *show = [[NewView alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:show animated:YES];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    listItems = [[NSMutableArray alloc] init];
    
[listItems addObject:@"First Entry"];
    NSLog(@"ListItems aus OldView: %@", listItems);

}

Vielleicht könnt ihr das ja mal kopieren und schauen ob es bei euch läuft.
 

Pennywise81

Jonagold
Registriert
23.07.09
Beiträge
21
Du versuchst das gesamte Array als String auszugeben. Das kann natürlich nicht funktionieren. Wenn Du die Objekte allerdings einzeln aus dem Array holst und dann ausgibst, sollte es funktionieren. Z.B.:
Code:
NSLog(@"ListItems aus OldView: %@", [listItems objectAtIndex:0]);

Mit einer for- oder for each- Schleife kannst Du auch alle Objekte im Array ausgeben.

Code:
    for (NSString* currentString in listItems) {
        NSLog(@"Current Entry: %@", currentString);
    }
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ich erzeuge nur in der NewView.h eine Instanz von OldViewViewController, so wie es in dem Quellcodeabschnitt zu sehen ist.
Nein, in dem Quellcodeabschnitt ist zu sehen, dass Du eine Instanzvariable für ein Objekt der Klasse OldViewViewController deklarierst. Eine Instanz erzeugen geht anders.

MacApple
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Du versuchst das gesamte Array als String auszugeben.
Nein, das versucht er nicht. Der Format-Specifier '%@' steht nicht für einen String, sondern für ein Objective-C Objekt:

Objective-C object, printed as the string returned by descriptionWithLocale: if available, or description otherwise. Also works with CFTypeRef objects, returning the result of the CFCopyDescription function.
MacApple
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
@Pennywise81
nein das funktioniert nicht, denn das habe ich ja bei diesem TestArray auch nicht gemacht, und da funktioniert es ja.
@MacApple
achso, also nee, wie man sehen kann mach ich das nicht, wo muss ich das denn dann hinschreiben, wenn überhaupt notwendig ist?
in die NewView.h?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ich habe ein Dokument verlinkt, dass ich Dir sehr ans Herz lege. Das erklärt wie Objective-C funktioniert.

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
du erzeugst mit deinem Code auch etliche Memory-Leaks... aber das habe ich dir ja schon ein paar mal gesagt in all deinen anderen Threads.

Gruss ppocket

PS: Wieso 'initialisierst' du das listItems-Array für den OldView im NewView noch einmal? Ich würde in diesem Fall das Array-Property auf readonly, nonatomic einstellen, denn aussenstehende Objekte wollen ja die List-Items, also den Inhalt auslesen oder verändern. Die wollen nicht das gesamte Array, welches nur den Inhalt verwaltet neu setzen oder es verändern.

Code:
@interface TestController : NSObject {
   NSMutableArray *testArray;
}

@property(readonly, nonatomic) NSMutableArray *testArray;

@end

Bei diesem Testarray kannst du von aussen nun jederzeit neue Objekte in das Array setzen und einige oder alle entfernen. Aber eben nicht das array selber löschen oder neu initialisieren. Denn dies ist ja nicht nötig.
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Jo, es geht !!! Vielen Dank an MacApple auch für den Link.
Die entscheidenen Zeilen waren:
Code:
oldViewObject = [[OldViewViewController alloc] init];
oldViewObject.listItems =[[NSMutableArray alloc] init];
Denn erst wenn man das ViewObjekt und den Array initialisiert mit alloc, können diese bestimmte Nachrichten verarbeiten.
Werde jetzt weitere Tests vornehmen und mich melden falls noch was unklar ist um nicht einen neueen Thread aufzumachen.
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Du hattest vergessen den Controller zu instanzieren? Verstehe ich das richtig? Du instanzierst den Controller des Views in dem View selbst?
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Trotzdem erzeugst du in der zweiten Zeile ein Memory-Leak! :(

Gruss ppocket
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Und mit objektorientierter Programmierung hat das auch nicht viel zu tun. ;)

MacApple
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
@Pii
Ich instanziiere den OldViewViewController in der NewView.m also nicht im OldViewViewController selbst.

@poljpocket
Nicht wenn ich weiter unten in der dealloc-Methode dem oldViewObject eine release nachricht schicke.

@MacApple
wieso nicht? Ich habe 2 Klassen und Objekte die miteinander interagieren und auf Attribute der anderen zugreifen.
Würde ich alles in eine klasse packen und keine Objekte anlegen dann hätte es nix damit zu tun.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
@poljpocket
Nicht wenn ich weiter unten in der dealloc-Methode dem oldViewObject eine release nachricht schicke.

Ich habe ja gesagt, es sei die zweite Zeile, nicht die erste. Und sehr wohl erzeugst du ein leak!

Da dein property den zugewiesenen Wert 'retaint', musst du das so schreiben, sonst gibts eben ein leak:

Code:
oldViewObject.listItems = [[[NSMutableArray alloc] init] autorelease];

Gruss ppocket
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
Objekte in einer View zu verwalten ist immer heikel, damit bremst man nur die View aus. Erstelle hierzu lieber ein Controller Objekt, welches diese Aufgabe übernimmt, damit muss sich die View nur noch um seine Hauptaufgabe kümmern, also Dinge anzuzeigen :p
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Also erstmal bedanke ich mich nochmal für die rege Beteiligung und die ganzen Ratschläge die ihr für mich habt.
Das mit dem autorelease habe ich mittlerweile eingebaut.
Jetzt habe ich noch eine letzte Hürde zu knacken.

Ich habe innerhalb des OldView ein TextFeld. Da gebe ich etwas ein und drücke auf einen Button. Es öffnet sich ein zweiter View in dem eine Tabelle erscheint, die einige statische Einträge besitzt. Bis hierhin funktioniert alles. Jetzt dachte ich mir.. ok ich übernehme die Eingaben aus dem textField der oldView und packe das in die Tabelle der NewView.
Dazu wollte ich die Textfield eingaben erstmal in dem listItems Array speichern.
Code:
[oldViewObject.listItems addObject:oldViewObject.textField.text];
Der Witz ist, das gibt keinen Fehler aber es steht mal wieder NULL drin.
Solange ich mich im OldView befinde ist alles gut, die Werte aus dem textField
kann ich dann auch in einer Variablen speichern. Sobald ich aber die NewView lade und
von dort aus auf oldViewObject.textField.text zugreife ist das NULL also die Eingaben sind plötzlich weg.
Ich denke das hat etwas mit der Gültigkeitsdauer zutun.
Aber was soll ich machen? Er kennt die Variablen aber die Werte gehen flöten.