Wenn ich über eine Objective-C-Methode verfüge, die einen Objektparameter verwendet und diese Methode intern einen Block verwendet, gibt es eine Möglichkeit, das Objekt innerhalb des Blocks zu ändern?Wie kann ich die Parameter einer ObjC-Methode innerhalb eines Blocks ändern?
Es ist mein Verständnis, dass Blöcke Variablen von ihrem übergeordneten Bereich erfassen, indem sie auf sie innerhalb des Blocks verweisen, und dass sie standardmäßig kopiert werden. Und wenn ich in der Lage sein möchte, mit einer Kopie eines umgebenden Objekts zu modifizieren, anstatt mit ihr zu arbeiten, kann ich ihre Deklaration mit __block
voranstellen, aber ich kann dies nicht mit Methodenparametern tun, da ich sie nicht selbst deklariert habe, richtig?
Zum Beispiel:
- (void)doWorkWithString:(NSString *)someString
{
[NSFoo doAwesomeClassMethodWithBlock:^{
// How can I modify someString here directly?
// By just changing someString, I'm changing the captured copy
}];
}
Ich bin zu faul, um die Dokumente nachschlagen, aber ich glaube nicht, dass gefangene Variablen zu einem Block kopiert werden; das wäre sehr überraschend, da Objekte keine Kopie implementieren können. Wenn __block nicht angegeben wird, werden die Objekte jedoch vom Block beibehalten. Innerhalb des Blocks unterscheiden sich Objektzeiger nicht anders als irgendwo sonst. Um Ihre Frage zu beantworten, können Sie sie beliebig modifizieren. Was Sie nicht tun können, ist in eine Variable zu schreiben, die erfasst wurde * IF * __block wurde nicht geliefert. Variablen, die mit __block markiert sind, werden vom Block nicht beibehalten. Seien Sie also vorsichtig. Hoffentlich macht das einen Sinn. –
@darren: Nicht-Blockvariablen zu einem Block * werden * kopiert. Aber der Wert einer Variablen ist niemals ein Objekt. Sie können nur einen * Objektzeiger * haben. Wenn also ein Block einen Objektzeiger erfasst, kopiert er den Zeiger. Das hat absolut nichts mit dem Kopieren von Objekten zu tun. – newacct
Ich meinte "Objektzeiger" -Parameter, wenn ich "Objektparameter" sagte. z.B. Übergeben einer NSString * -Instanz. –