1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Daten wollen nicht ins NSMutableArray

Dieses Thema im Forum "iOS-Developer" wurde erstellt von bginner, 06.03.10.

  1. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    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.
     
  2. Pii

    Pii Rheinischer Krummstiel

    Dabei seit:
    25.06.07
    Beiträge:
    383
    Mal raten.
    Hast Du vielleicht die Accessors vergessen?
    Und sollte listItems nicht schon initialisiert sein?
     
  3. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    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?
     
  4. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Erzeugst du denn auch eine Instanz von OldViewController bei der Initialisierung von NewView oder übergibst der NewView Instanz eine Instanz von OldViewController?

    MacApple
     
  5. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    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.
     
  6. Pennywise81

    Pennywise81 Jonagold

    Dabei seit:
    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);
        }
    
     
  7. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    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
     
  8. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Nein, das versucht er nicht. Der Format-Specifier '%@' steht nicht für einen String, sondern für ein Objective-C Objekt:

    MacApple
     
  9. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    @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?
     
  10. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Ich habe ein Dokument verlinkt, dass ich Dir sehr ans Herz lege. Das erklärt wie Objective-C funktioniert.

    MacApple
     
  11. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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.
     
  12. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    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.
     
  13. Pii

    Pii Rheinischer Krummstiel

    Dabei seit:
    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?
     
  14. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Trotzdem erzeugst du in der zweiten Zeile ein Memory-Leak! :(

    Gruss ppocket
     
  15. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Und mit objektorientierter Programmierung hat das auch nicht viel zu tun. ;)

    MacApple
     
  16. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    @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.
     
  17. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    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
     
  18. Pii

    Pii Rheinischer Krummstiel

    Dabei seit:
    25.06.07
    Beiträge:
    383
    Das habe ich habe ja gesagt.
     
  19. karolherbst

    karolherbst Danziger Kant

    Dabei seit:
    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
     
  20. bginner

    bginner Ingrid Marie

    Dabei seit:
    13.12.09
    Beiträge:
    264
    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.
     

Diese Seite empfehlen