Vor dem Hinzufügen von Objekten zu NSMutableArray in der öffentlichen Schnittstelle schützen

8

Ich möchte den Zugriff auf NSMutableArray in der öffentlichen Schnittstelle

schützen

Ich versuche dies zu tun, indem ich die Eigenschaft als NSArray in der öffentlichen Schnittstelle und als NSMutableArray in der privaten Schnittstelle wie folgt definiere:

%Vor%

Aber das funktioniert nicht - also muss ich stattdessen die Eigenschaft in der öffentlichen Schnittstelle NSMutableArray definieren:

%Vor%

Das Ziel besteht darin, schreibgeschützten Zugriff auf Kommentare für API-Clients und vollständigen Zugriff auf Methoden wie addObject: in der Implementierung bereitzustellen.

So definieren Sie das Ziel klarer:

  1. Der Client sollte als NSArray auf Eigenschaften zugreifen können, ohne auf Mutationsmethoden zugreifen zu können.
  2. Der Client sollte nicht in der Lage sein, die Kommentare zu aktualisieren, um auf einen neuen Wert zu zeigen.
  3. Die Lösung muss ohne das Erstellen zusätzlicher Strukturen und das Kopieren von Arrays durchgeführt werden.

Also einfach die Frage war, ob es möglich ist, die Definition von Eigenschaften allgemeiner zu machen (NSArray statt NSMutableArray).

Gibt es einen anderen sauberen Weg, um das Ziel zu erreichen, oder muss ich überall NSMutableArray verwenden?

Lösung

Nachdem ich meine ursprüngliche Frage und Antworten gelesen hatte, wurde mir klar, dass ich in der öffentlichen Schnittstelle NSCrypt und in der Implementierung NSMutableArray verwenden möchte - aber für eine Eigenschaft ist das nicht möglich. Also die Antwort ist nicht möglich.

Also werde ich einfach eine Eigenschaft mit NSMutableArray ohne zusätzlichen Schutz verwenden.

Aber ich wähle auch die am besten geeignete Antwort aus, wenn Sie wirklich Schutz vor Einfachheit und Effizienz bevorzugen.

    
Vladimir 31.03.2013, 18:27
quelle

5 Antworten

13

Sie benötigen keine öffentliche Eigenschaft , wenn Sie nur Clients das Lesen des Arrays erlauben möchten.

Erstellen Sie einfach eine Zugriffsmethode, die eine Kopie Ihres privaten änderbaren Arrays zurückgibt:

%Vor%

Dieses Muster kann z. B. in NSView : constraints und subviews intern geändert werden, aber nur zum Lesen über eine einzige Methode verfügbar gemacht werden, die ein nicht veränderbares Array zurückgibt.

    
Josh Caswell 31.03.2013, 18:40
quelle
3

Eine Lösung wäre, die Eigenschaft als schreibgeschützt als NSArray zu deklarieren. Erstellen Sie dann in Ihrer Implementierung eine separate, schreibbare Eigenschaft basierend auf NSMutableArray .

In der .h:

%Vor%

In der .m:

%Vor%

Anstatt die schreibgeschützte Eigenschaft zu synthetisieren, schreiben Sie:

%Vor%

In der .m machst du alles mit self.internalComments .

    
rmaddy 31.03.2013 18:42
quelle
2

Eine weit sauberere Lösung wäre, wenn es für Ihren Anwendungsfall akzeptabel wäre, die Eigenschaft als NSArray zu deklarieren, während sie mit einem NSMutableArray unterstützt wird. Der Client könnte das Array technisch modifizieren, indem er es einfach in ein änderbares Array umwandelt, aber Sie machen deutlich, dass dies eine schlechte Idee wäre.

A @property ist einfach ein Wrapper um zwei Methoden, einen Getter und einen Setter, die typischerweise von einer Speichervariablen unterstützt werden. Der einfachste Weg, diese Lösung zu implementieren, wäre:

%Vor%

Wenn Sie möchten, dass der Benutzer das gesamte Array ersetzen kann ( order.comments = ... ), entfernen Sie das Attribut readonly für die Eigenschaft und überschreiben Sie die Methode -setComments: :

%Vor%

Da Objective-C eine dynamische Sprache ist, ist es nicht möglich, den Zugriff einer Person auf eine Variable vollständig zu verhindern, da Sie Schnittstelle direkt mit der Laufzeit oder Aufruf Methoden von ihrem Selektor, wenn Sie wirklich in Dingen herumstochern wollen, die Sie nicht sind sollst. Alles, was Sie wirklich tun können, ist klarzustellen, dass dies eine schlechte Idee ist.

    
liclac 04.10.2013 13:11
quelle
1

Zwei Lösungen:

  1. Geben Sie eine nicht veränderbare Kopie des Arrays zurück - der Client ruft alle Kommentare auf einmal ab.
  2. Gibt die Anzahl der Kommentare und einzelnen Kommentare zurück.

Wählen Sie, es gibt Argumente für beide und es hängt davon ab, was Ihnen passt:

%Vor%     
CRD 31.03.2013 19:02
quelle
0

Wenn Sie nicht möchten, dass der Client diese Eigenschaft überhaupt festlegen kann, deklarieren Sie ihn in der öffentlichen Schnittstelle als readonly . Wenn Sie nicht möchten, dass der Client das vom Client gelesene Array mutieren kann, deklarieren Sie es als NSArray. Inzwischen sind Sie auf Ihrer Seite readwrite und copy . Wenn Sie readwrite verwenden, können Sie ein mutableCopy (was ein NSMutableArray sein soll) übernehmen, Ihre Änderungen vornehmen und dann die Eigenschaft erneut festlegen. Indem Sie copy angeben, stellen Sie sicher, dass der Client immer ein NSArray sieht.

Also, Kunde:

%Vor%

Innenauftrag:

%Vor%     
matt 31.03.2013 18:28
quelle