NSMutableArray-Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSMutableArray-Problem

    Hallo,
    ich bin relativ neu hier und komme mit der Klasse NSMutableArray nicht klar! Was mache ich falsch?

    myArray wird in der .h-Datei deklaiert

    Quellcode

    1. @interface DummyAppDelegate : NSObject <NSApplicationDelegate> {
    2. @private // ...
    3. NSMutableArray* myArray; // ...
    4. }
    5. - (IBAction)addItem:(id)sender;
    6. @property (assign) IBOutlet NSWindow *window;
    7. @end
    Alles anzeigen



    Hier awakeFromNib aus der .m-Datei

    Quellcode

    1. - (void) awakeFromNib {
    2. NSLog(@"awakeFromNib");
    3. myArray = [NSMutableArray arrayWithCapacity:2];
    4. }



    Und hier der Versuch das Array zu füllen:

    Quellcode

    1. - (IBAction)addItem:(id)sender {
    2. NSLog(@"addItem!");
    3. MyProfil* mp = [MyProfil new];
    4. [mp setPositionZA:1000];
    5. [mp setPositionSA:2000];
    6. [mp setPositionNA:3000];
    7. [mp setTimecode:0];
    8. [myArray addObject: mp]; // Hier gibt es Probleme !!!!
    9. NSLog(@"addItem: Größe des Arrays: %ld", [myArray count]);
    10. [mp release];
    11. }
    Alles anzeigen



    Hier noch meine Objekte (MyProfil.h):

    Quellcode

    1. //
    2. // MyProfil.h
    3. //
    4. #import <Foundation/Foundation.h>
    5. @interface MyProfil : NSObject {
    6. @private
    7. long positionZA;
    8. long positionSA;
    9. long positionNA;
    10. long timecode;
    11. }
    12. @property long positionZA;
    13. @property long positionSA;
    14. @property long positionNA;
    15. @property long timecode;
    16. @end
    Alles anzeigen



    MyProfil.m:

    Quellcode

    1. //
    2. // MyProfil.m
    3. //
    4. #import "MyProfil.h"
    5. @implementation MyProfil
    6. @synthesize positionNA;
    7. @synthesize positionSA;
    8. @synthesize positionZA;
    9. @synthesize timecode;
    10. - (id)init
    11. {
    12. self = [super init];
    13. if (self) {
    14. // Initialization code here.
    15. positionNA = 0;
    16. positionSA = 0;
    17. positionZA = 0;
    18. timecode = 0;
    19. }
    20. return self;
    21. }
    22. - (void)dealloc
    23. {
    24. [super dealloc];
    25. }
    26. @end
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LarsKrachen ()

  • Hallo gritsch,
    sorry, dass ich es noch nicht gelernt habe, aber darum bin ich hier! :thumbsup:

    Ok, Speicherverwaltung! Geht's auch genauer?

    Ach ja, hier noch die Fehlermeldung:
    2012-11-29 08:13:54.627 Dummy[325:903] -[CFXPreferencesSearchListSource addObject:]: unrecognized selector sent to instance 0x100607eb0

    Ich habe ein wenig rumprobiert und das ganze zum Laufen gebracht:
    In addItem habe ich jetzt folgendes geändert:
    MyProfil* mp = [[MyProfil alloc] init];
    statt

    MyProfil* mp = [MyProfil new];
    Was ist falsch an new?



    Alternativ habe ich jetzt in awakeFromNib jetzt:
    myArray = [[NSMutableArray alloc] init];
    und die folgende Zeile rausgenommen:
    myArray = [NSMutableArray arrayWithCapacity:2];


    Jetzt funktioniert es. Aber warum geht es mit:
    myArray = [NSMutableArray arrayWithCapacity:2];
    nicht? Würde mich freuen, wenn mir das jemand erklären könnte!
  • LarsKrachen schrieb:

    Hallo gritsch,
    sorry, dass ich es noch nicht gelernt habe, aber darum bin ich hier! :thumbsup:

    Ok, Speicherverwaltung! Geht's auch genauer?

    Ach ja, hier noch die Fehlermeldung:
    2012-11-29 08:13:54.627 Dummy[325:903] -[CFXPreferencesSearchListSource addObject:]: unrecognized selector sent to instance 0x100607eb0

    Ich habe ein wenig rumprobiert und das ganze zum Laufen gebracht:
    In addItem habe ich jetzt folgendes geändert:
    MyProfil* mp = [[MyProfil alloc] init];
    statt

    MyProfil* mp = [MyProfil new];
    Was ist falsch an new?



    Alternativ habe ich jetzt in awakeFromNib jetzt:
    myArray = [[NSMutableArray alloc] init];
    und die folgende Zeile rausgenommen:
    myArray = [NSMutableArray arrayWithCapacity:2];


    Jetzt funktioniert es. Aber warum geht es mit:
    myArray = [NSMutableArray arrayWithCapacity:2];
    nicht? Würde mich freuen, wenn mir das jemand erklären könnte!


    genau das sollst du nicht fragen sondern lernen. das wurde hier schon x mal besorochen und kann auch nicht mit einem satz erklärt werden. wenn du willst, dann erklär ichs mit einem wort: SPEICHERVERWALTUNG ;)
  • LarsKrachen schrieb:

    Woher soll ich lernen, wenn mir keiner sagt wo meine Fehler liegen? Speicherverwaltung hilft mir jetzt echt richtig weiter! Natürlich weiß ich das da das Problem liegt!


    steigst du auch in ein auto, baust einen unfall mit 3 toten und beschuldigst dann die anderen dass sie dir das autofahren nicht beigebracht haben bzw dass du doch nicht zuerst den führerschein machen willst sondern einfach drauflosfahren...
    vergleich den führerschein mit grundlegendem wissen welches dir jedes buch vermitteln sollte ;)
  • LarsKrachen schrieb:

    Würde mich freuen, wenn mir das jemand erklären könnte!

    Ergänzend zu gritsch' Hinweis: Du stolperts über die "Ownership" von Objekten: Wenn Du Objekte per init / new / copy erstellst, bist Du auch für das Auflösen dieser Zugehörigkeit verantwortlich (nicht zu verwechseln mit dem Freigeben von Speicher). Bei autoreleased Objekten (z. B. aufgrund des Anlegen eines Objektes mit den "convenience methods" wie "arrayWith...") übernimmt die Runtime deren Freigabe. Andere Objekte, z. B. als Rückgabe-Objekte von diversen anderen Methoden, "gehören" Dir nicht und Du darfst sie somit auch nicht freigeben.

    Das ganze Thema ist extrem wichtig, da Verstösse i. d. R. in Abstürze der App oder Memory Leaks resultieren, und es eines der Grundkonzepte von Objective-C darstellt. Absolute Pflicht-Lektüre ist also ein Werk über die "Speicherverwaltung" ... und daher auch die etwas angestrengten Reaktionen hier im Forum.

    HTH, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Nachdem Du den Linktipp von mir mit keiner Silbe würdigst und rumprobierst: Ich bin dann raus und Höflichkeit ist auch eine Zier.

    Keine gute Werbung für "FilmING Peter Gerulat."

    Leute gibts
    Karin
  • Vielen Dank an MyMattes und lavendelHonig! Diese Beiträge haben mir sehr weitergeholfen!

    Was die Höflichkeit in diesem Beitrag betrifft, so tut es mir leid das ich negativ aufgefallen bin. Ich halte aber Beiträge mit oberflächlichen Phrasen für wenig Hilfreich! Klar macht man als Neuling viele Fehler und versteht nicht alles auf anhieb, dennoch ist man für jeden konkreten Tipp sehr dankbar. Wenn man diese nicht geben will, dann sollte man lieber gar nichts schreiben. Und sorry dafür, dass ich noch keinen Xcode-Führerschein habe!!! Man muss nicht zu jedem Beitrag etwas schreiben.

    Was ich auch für schlechten Stil halte sind Aussagen wie: "Keine gute Werbung für FilmING Peter Gerulat."
    Warum: Toller Suchmaschineneintrag!
  • Das Problem was viele Neulinge haben ist, dass sie denken das Forum ist dafür da ihnen zu helfen programmierne zu lernen. Das ist aber eben nicht der Fall.

    Die meisten (oder eigentlich alle) die hier posten und Ahnung haben sind selber beruflich in der Branche tätig und müssen selber ständig lernen um immer auf dem neusten Stand zu sein. Das lernt man als Programmierer sehr schnell. Und da hilft einem auch keiner es sei denn man bucht ein Seminar für vierstellige Beträge. Deshalb erwarten Sie von Anfängern auch, dass sie entweder ebenfalls Geld ausgeben um etwas zu lernen (Buch kaufen, Seminar besuchen etc) oder eben sich auf andere Weise durchbeissen um die Grundlagen zu lernen. Das tut aber kaum einer der Neulinge. Diese schaun sich zwei Tutorials an fangen dann an eine App zu machen zu der sie eine Idee haben. Sobald sie aber, ohne sich vorher die Grundlagen angeeignet zu haben, anfangen im Code was zu ändern kommt es genau zu dem Phänomen was auch der TO hat. Eskommt nur Mist dabei raus, der mit Programmieren eigentlich gar nichts zu tun hat, denn er weiß nicht einmal wie man ein Object richtig erstellt, geschweige denn wie das Ownership eines solchen aussieht. Und statt sich nun die Grundlagenliteratur zu nehmen, wird hier gefragt, dieser eine Fehler behoben und munter weiter programmiert.... Das hat aber nichts mit lernen zu tun.

    Nur wenige begreifen das und aus denen werden dann auch gute Programmierer. Der Rest bleibt für ewig auf dem Stand "Meine App läuft, auch wenn ich nicht genau weiß warum"

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • LarsKrachen schrieb:

    Hallo Thallius,
    ich gebe dir recht. Ich habe auch zwei Bücher. Aber manchmal muss man eben mit der Nase auf ein Problem gestoßen werden und dann sind Beiträge wie die von MyMattes und lavendelHonig eben die richtigen Augenöffner!


    seh ich nicht so. denn du hast KEINEN PLAN von speicherverwaltung. Was nützen dir 10 bücher wenn du sie nicht gelesen (und viel wichtiger: verstanden) hast...
  • seh ich nicht so. denn du hast KEINEN PLAN von speicherverwaltung. Was nützen dir 10 bücher wenn du sie nicht gelesen (und viel wichtiger: verstanden) hast...

    @gritsch: Auch das kann man höflicher ausdrücken. Manchmal will man aber auch einfach mal das Buch beiseite legen und irgendwas probieren. Man will ja nicht nur lesen, sondern auch mal einen Erfolg haben. Okay. Er wollte schon mehr als nur mal etwas probieren.

    Vorschlag: Warum schreibt nicht jemand mal einen kurzen Überblick, welche Basics vorausgesetzt werden.
    Was MUSS man wissen, damit man loslegen kann und nicht gleich im Forum einen auf die Rübe bekommt.

    Vielleicht noch ein paar Buchtipps und links...

    und wenn dann mal eine absolut "blöde" Frage kommt, dann kann man darauf locker verweisen und muss sich nicht aufregen.
  • margroth schrieb:

    Vorschlag: Warum schreibt nicht jemand mal einen kurzen Überblick, welche Basics vorausgesetzt werden.

    Lass Dich nicht aufhalten ... :D

    Aber im Ernst: Das halte ich für ... sorry ... Quark: Wo sollte man denn anfangen? Boolsche Algebra? Algorithmen und Datenstrukturen? Speicherverwaltung? Zahlensysteme? Rechnerarchitektur? ... ? Software-Entwicklung ist nun einmal ein komplexes Thema und wie schon mehrfach gesagt ein Bereich des ewigen Lernens. Ein Anfänger sollte m. E. am besten selber abschätzen können, was er kann / kennt / weiss und was nicht; ob man dann direkt mit einem eigenen (kleinen!) Projekt beginnt und begleitend liest, oder erstmal Theorie aufsaugt, ist persönliche Vorliebe, aber ...

    ein einfaches Grundprinzip: "Verwende keinen Code, den Du nicht 100% verstanden hast!" ... jedes Zeichen.

    Meines Erachtens für's Lernen das einzig richtige Vorgehen ... im Erfolgsdruck eines professionellen Entwicklers weicht man diesen Grundsatz dann schon einmal auf und zieht sich auf verfügbare Fremd-Libraries o. ä. zurück.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • margroth schrieb:

    seh ich nicht so. denn du hast KEINEN PLAN von speicherverwaltung. Was nützen dir 10 bücher wenn du sie nicht gelesen (und viel wichtiger: verstanden) hast...

    Vorschlag: Warum schreibt nicht jemand mal einen kurzen Überblick, welche Basics vorausgesetzt werden.
    Was MUSS man wissen, damit man loslegen kann und nicht gleich im Forum einen auf die Rübe bekommt.

    Weil das vermutlich auch nur von den wenigsten gelesen wird. Aber nicht weil sie nicht wollen, sondern weil es so viele tausende Einstiegswege zum "Mount Cocoa" gibt.

    -- hns
  • hns schrieb:

    Weil das vermutlich auch nur von den wenigsten gelesen wird. Aber nicht weil sie nicht wollen, sondern weil es so viele tausende Einstiegswege zum "Mount Cocoa" gibt.
    Missverständnis. Nicht ein Einsteiger Tutorial, sondern nur aufzählen, was das "existenzielle" Wissen ist. Okay. genannt wurde zum Beispiel die Speicherverwaltung.
    Dann würde davor zum Beispiel kommen die unterschiedlichen Typenvariablen. Dann als nächstes, Operatoren, dann Schleifen/If else.
    Damit könnte man schon ein Programm schreiben.
    Und dann MVC, usw.

    Nur eine Liste, wenn da noch kleinere Hinweise drin stehen würden. toll.
    ##############################################
    okay. merke gerade, dass das mir ein wenig komisch vorkommt. Wenn ich programmieren möchte, dann sind bestimmte Dinge mir einfach bekannt.
    Dennoch: Wenn jemand vorher mit "basic", php oder ähnlichen gearbeitet hat, dann gibt es da halt eine gehörige Umstellung. Und dazu gehört halt zum Beispiel Speicherverwaltung (mit ARC).
    (Wenn man das nicht beachtet, will man einfach loslegen, weil man ja schon programmieren kann... .... und dann funktionierts halt nicht.)
    ##########################################


    Es ging mir ja insgesamt mehr darum, sich nicht irgendeinen "aggressiven" Text auszudenken um auf eine "dumme" Frage zu antworten, sondern einfach locker darauf verweisen zu können.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von margroth ()

  • margroth schrieb:

    Speicherverwaltung (mit ARC).


    Schon der nächste Denkfehler...

    ARC ist zwar nett aber es nutzt Dir auch nichts wenn du nicht genauso gut Ohne ARC zurecht kommen würdest. Du nutzt dann nämlich einfach Compilerhilfe ohne zu wissen was sie macht. Damit wirst Du irgendwann auch böse auf die Nase fallen, wenn es z.B. mal ums Multi-Threadding oder ähnlich komplexe Themen geht.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)