Maximale Größe (Inhalt) eines NSTextView

  • Was vielleicht erwähnenswert ist: NSTextStorage basiert auf NSMutableString und nicht auf NSString. Und um's genau zu machen: die verwendete string klasse heißt NSBIGMutableString. NSMutableString ist ja genau so ein Cluster wie NSString. Jetzt könnte man über die idee von Nuke nochmal nachdenken. Ich halte es durchaus für realistisch...
  • Original von Tom9811
    Und? Dass etwas aufbaut, heißt nicht, dass es eingrenzt? Weil der Text-Storage auf einem String aufbaut, kann er nicht eine Zeile enthalten wie "length << 1 / 3"? OOder sonstige Informationen im Striing unterbringen, die die netto Stringlänge eingrenzt?

    Warum sollte Apple so einen Blödsinn machen?

    Original von Tom9811
    Man weiß es einfach nicht. Deshalb kann man auch keine Behauptungen darüber aufstellen, sondern nur Vermutungen anstellen.

    Wenn das Textsystem nicht NSMaximumStringLength vertragen könnte, müsste man in der Dokumentation ja wohl einen Hinweis dazu finden. Zum Beispiel in der Beschreibung der Methode -setString:. Da steht aber nichts darüber, dass der übergebene String nicht so lang sein darf wie jeder andere String. Dann steht auch noch bei der Methode -string
    For performance reasons, this method returns the current backing store of the text object.

    Das dürfte interessante Ergebnisse geben, wenn Apple da zusätzliche Informationen des Textsystems im String speichern würde.

    Michael
  • Ich habe leider feststellen müssen, das sich NSTextView nicht als schnelles Tool zum erstellen eines Debugging Logs eignet. Es kommt immer wieder zu Problemem, und das sind dann für mich "umgekehrte Heisenbugs": Der Fehler tritt NUR auf, wenn das Programm in einer Testumgebung gestartet wird.

    Meine Lösung: Ich hab den Testern beigebracht, wie man mit Console.app das Log liest. Danke für Eure Ansätze, vielleicht schreib ich ja nochmal eine volle Logging Komponente.

    Alex
    The only thing that really worried me was the ether.
  • Original von M.A.X
    NSTextStorage basiert auf NSMutableString und nicht auf NSString.

    Und NSMutableString ist eine Subklasse von NSString.

    Original von M.A.X
    NSMutableString ist ja genau so ein Cluster wie NSString. Jetzt könnte man über die idee von Nuke nochmal nachdenken. Ich halte es durchaus für realistisch...

    Wie NSMutableString intern realisiert ist, ist jedoch uninteressant. NSMaximumStringLength gilt auch für mutable Strings. Nuke meinte aber auch wohl eher, dass NSTextStorage sich ein Array mit Strings anlegt.

    Vielleicht sollte man noch erwähnen, dass NSMaximumStringLength in der Praxis nie erreicht werden kann (zumindest auf 32Bit-Systemen), weil ja dann bereits der gesamte Adressbereich eines Programms nur für den String gebraucht werden würde. Das Programm selbst und andere Daten des Programms möchten aber auch noch etwas Platz haben.

    Michael
  • Keine Ahnung, oob die so etwas machen oder etwas anderes machen. Ich habe gerade die Source von NSTextContainer verlegt. Daher weiß ich nicht, was sie dort machen und stelle keine Vermutungen darüber auf.

    Von den Fähigkeiten einer Superklasse auf die einer Subklasse zu schließen, halte ich halt für etwas kühn.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Ich habe gerade die Source von NSTextContainer verlegt.

    Die würden Dir auch nichts nützen. Musst schon die von NSTextStorage nehmen.

    Original von Tom9811
    Daher weiß ich nicht, was sie dort machen und stelle keine Vermutungen darüber auf.

    Ich stelle auch keine Vermutungen an, sondern stütze mich auf die Apple Dokumentation. Wenn man sich nicht mal auf die verlassen darf, na dann gute Nacht.

    Michael
  • Ich denke aber, dass Michael durchaus recht haben könnte. 2 GB in nen Text Storage zu packen ist dann doch schon aberwitzig. Und ich denke, dass der Tom keine Ahnung hat, weil er sonst nich den TextContainer angesprochen hätte, der einfach mal *gar* nix mit dem string zu schaffen hat. Das ist ne reine Layout-Klasse.
  • Er hat recht, weil er sagt, dass es so ist, und es so sein könnte.
    Ich habe Unrecht, weil ich sage, dass es eine Mutmaßung ist und so sein könnte.
    Aha! Da fragt sich der interessierte Leser, was wohl das Modalverb können ausdrückt, zumal im Konjunktiv?
    a) Etwas, was total krasse sicher ist, Alder!!!!!!!!!!! Wieso sollte ich sonst "könnte" schreiben?
    b) Eine Möglichkeit.

    Natürlich meinte ich Storage, nicht Container.

    Ich weiß allerdings, dass du jedenfalls keinen Plan hast, wenn du schreibst, dass Storage keine Subklasse von NSString sei.

    Daher ist es mir auch egal, dass du Stunden später mich meiner Meinung anschließt, es wäre ein Falll der Lazyness.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ich bin ja ein guter Mensch und helfe gerne den Planvollen. Mal ein Auszug aus NSTextStorage in GNUStep.

    Quellcode

    1. - (void) processEditing
    2. {
    3. NSRange r;
    4. int original_delta;
    5. unsigned int i;
    6. unsigned length;
    7. NSDebugLLog(@"NSText", @"processEditing called in NSTextStorage.");
    8. /*
    9. * The _editCount gets decreased later again, so that changes by the
    10. * delegate or by ourselves when we fix attributes dont trigger a
    11. * new processEditing */
    12. _editCount++;
    13. [nc postNotificationName: NSTextStorageWillProcessEditingNotification
    14. object: self];
    15. /* Very important: we save the current _editedRange */
    16. r = _editedRange;
    17. original_delta = _editedDelta;
    18. length = [self length];
    19. // Multiple adds at the end might give a too long result
    20. if (NSMaxRange(r) > length)
    21. {
    22. r.length = length - r.location;
    23. }
    24. /* The following call will potentially fix attributes. These changes
    25. are done through NSTextStorage methods, which records the changes
    26. by calling edited:range:changeInLength: - which modifies editedRange.
    27. As a consequence, if any attribute has been fixed, r !=
    28. editedRange after this call. This is why we saved r in the first
    29. place. */
    30. [self invalidateAttributesInRange: r];
    31. [nc postNotificationName: NSTextStorageDidProcessEditingNotification
    32. object: self];
    33. _editCount--;
    34. /*
    35. The attribute fixes might have added or removed characters. We must make
    36. sure that range and delta we give to the layout managers is valid.
    37. */
    38. if (original_delta != _editedDelta)
    39. {
    40. if (_editedDelta - original_delta > 0)
    41. {
    42. r.length += _editedDelta - original_delta;
    43. }
    44. else
    45. {
    46. if ((unsigned)(original_delta - _editedDelta) > r.length)
    47. {
    48. r.length = 0;
    49. if (r.location > [self length])
    50. r.location = [self length];
    51. }
    52. else
    53. {
    54. r.length += _editedDelta - original_delta;
    55. }
    56. }
    57. }
    58. /*
    59. * Calls textStorage:edited:range:changeInLength:invalidatedRange: for
    60. * every layoutManager.
    61. */
    62. for (i = 0; i < [_layoutManagers count]; i++)
    63. {
    64. GSLayoutManager *lManager = [_layoutManagers objectAtIndex: i];
    65. [lManager textStorage: self edited: _editedMask range: r
    66. changeInLength: _editedDelta invalidatedRange: _editedRange];
    67. }
    68. /*
    69. * edited values reset to be used again in the next pass.
    70. */
    71. _editedRange = NSMakeRange (0, 0);
    72. _editedDelta = 0;
    73. _editedMask = 0;
    74. }
    Alles anzeigen


    Ich erkenne da Additionen auf length. Ich weiß nicht, ob die zu einer Erhöhung über das Maximum führen können, so dass der Ursprung kleiner sein muss. Ich weiß aber, dass eine Addition das jedenfalls riskiert.

    Die Planvollen ohne Plan mögen es analysieren und belegen, dass dieser Zustand niemals eintreten kann. Die Planvollen können _dann_ eine Behauptung aufstellen.

    Bevor die Planvollen das gemacht haben, sollten sie weiterhin mit einer Kristallkugel programmieren. Das schient ja die überlegene Technik zu sein. Sie sollten dann aber nicht Mutmaßungen als feste Behauptung in die Welt setzen, weil das ziemlich planlos aussieht -- komisch ist nur, dass es immer die gleichen Verdächtigen sind. Immerhin, als grep taugen sie dann doch.

    Ja, das ist NSTextStorage/GNUStep. Und deshalb kann meine _keine_ Aussage darüber treffen, wie das in Cocoa ist.

    Ich bin es aber einfach langsam mal leid, den immer gleichen Experten hier das rauszusuchen. Wie wäre es, wenn man einfach mal Behauptungen, die man nicht belegen kann, einstellt. Es bleiben doch siicher ausreichend Behauptungen übrig, die man belegen kann. Oder etwa nicht?

    Danke für die Diskussion und gute N8.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • ;)
    Guten Morgen miteinander...
    Über die länge muss man nicht groß vermuten.
    Einer der Vorfahren des NSTextStorage ist NSAttributedString
    spätestens diese Klasse kann mit initWithString erstellt werden. Damit kann es wohl das TextStorage auch?! ;) Also ist die mindestlänge schonmal klar ...Maximale länge eines NSString.
    Meines erachtens wäre es gegen jede Vernunft das Teil jetzt intern länger machen zu können (was auch die 32bit grenze sprengen würde) ...aber nichts desto trotz liefert apple die möglichkeit den gesamten bereich mittels eines NSRange als bearbeitet zu markieren ...
    naja die typedef des NSRange sieht so aus
    typedef struct _NSRange {
    unsigned int location;
    unsigned int length;
    } NSRange;

    was wohl die 32bit bestätigt ... also min/max länge == maximale länge NSString
  • Nun ...das sie sachen erweitern kann ja klar... da hast du recht
    Aber Sie wird garantieren das sie(die Klasse) Variablen einer definierten größe aufnehmen kann ...
    Wie sollte die Fehlermeldung von apple lauten bei einem initWithString:(NSString *)
    "Ihr String ist zu Stringlastig?!" Nein ...Sie kann einen vollen NSString aufnehmen. Das würde selbst Microsoft machen ...und Apple garantiert. Es wäre ein Typefehler. Es wäre grob fahrlässig ... Es wäre ein hobby Programmierer der das getan hätte.
  • Original von Tom9811
    Bevor die Planvollen das gemacht haben, sollten sie weiterhin mit einer Kristallkugel programmieren.

    Wenn man keine Argumente hat, dann zieht man die Diskussion ins Lächerliche. Kenne ich von Dir ja schon. Wieso tue ich mir das eigentlich immer wieder an?

    Original von Tom9811
    Wie wäre es, wenn man einfach mal Behauptungen, die man nicht belegen kann, einstellt.

    Ja, wäre schön, wenn Du das mal tun würdest. Im Gegensatz zu Dir, habe ich nämlich Belege für meine Behauptung gebracht. Ich fasse sie Dir gerne noch ein letztes Mal zusammen.

    1. Es gibt eine Konstante für die maximale Länge eines Strings in Cocoa. Hier die Apple Dokumentation dazu:
    NSMaximumStringLength

    #define NSMaximumStringLength (INT_MAX-1)

    Discussion
    Used by NSString. Maximum number of characters in an NSString.
    Eine Konstante NSMaximumTextStorageLength gibt es nicht.


    2. Das Textsystem hat eine Methode -string, die in NSText definiert ist. Die Dokumentation dazu:
    string
    Returns the characters of the receiver’s text.

    - (NSString *)string

    Discussion
    For performance reasons, this method returns the current backing store of the text object. If you want to maintain a snapshot of this as you manipulate the text storage, you should make a copy of the appropriate substring.
    Der backing store des Textsystems ist NSTextStorage. Übrigens muss man bei Subklassen von NSTextStorage zwingend die Primitiv-Methode -string implementieren!


    3. Das Textsystem hat eine Methode -setString:, die in NSText definiert ist. Die Dokumentation dazu:
    setString:
    Replaces the receiver’s entire text with aString, applying the formatting attributes of the old first character to its new contents.

    - (void)setString:(NSString *)aString

    Discussion
    This method does not include undo support by default. Clients must invoke shouldChangeTextInRanges:replacementStrings: or shouldChangeTextInRange:replacementString: to include this method in an undoable action.
    Keine Warnung, dass der zu übergebene String ein Spezialstring sein muss, für den NSMaximumStringLength nicht gilt.

    Ich weiß nicht. Für mich hat Programmieren immer noch etwas mit Logik zu tun. Wenn an allen Ecken und Enden des Textsystems mit NSString gearbeitet wird und in der Dokumentation kein Hinweis zu finden ist, dass es sich dabei um Spezialstrings handelt, dann haben diese Strings schlicht die gleichen Eigenschaften, wie jeder andere String in Cocoa auch.

    Michael
  • Ich weiß nicht. Für mich hat Programmieren immer noch etwas mit Logik zu tun. Wenn an allen Ecken und Enden des Textsystems mit NSString gearbeitet wird und in der Dokumentation kein Hinweis zu finden ist, dass es sich dabei um Spezialstrings handelt, dann haben diese Strings schlicht die gleichen Eigenschaften, wie jeder andere String in Cocoa auch.


    Genau so ist es ...das ist ja das schöne an OOP wenn Apple hier etwas anderes im Sinn gehabt hätte
    gebe es ein child von NSString ...so in der Art von NSTextStorageString.

    Eigentlich ist es doof ...das die schönen Fragen und Antworten immer etwas "scharf" enden... ich dachte es wäre nur bei den Windows usern so, aber es liegt auch hier wohl an den Objecten, den Menschen ;)

    Ach ja, falls ich in meiner neuen Neugier über Cocoa übersehen hätte das es o.g. Object gibt nehm ich alles zurück und lasse mich gerne belehren.

    In diesem Sinne eine gute Nacht...