Der LLVM Compiler 3.0 stellt vier neue Eigentümer - Qualifikation: __strong, __autoreleasing, __unsafe_unretained, und __weak. Die ersten drei sind gemäß Spezifikation auch außerhalb von ARC erhältlich .
Wie Joshua angibt, sind standardmäßig alle Zeiger __strongunter ARC. Dies bedeutet, dass ein Objekt, das diesem Zeiger zugewiesen ist, so lange beibehalten wird, wie dieser Zeiger darauf verweist. Dies ist für die meisten Dinge in Ordnung, eröffnet jedoch die Möglichkeit, Zyklen beizubehalten, wie ich in meiner Antwort hier beschreibe . Wenn Sie beispielsweise ein Objekt haben, das ein anderes Objekt als Instanzvariable enthält, dieses zweite Objekt jedoch eine starke Verknüpfung zum ersten Objekt als Delegat aufweist, werden die beiden Objekte niemals freigegeben.
Aus diesem Grund existieren die __unsafe_unretainedund __weakQualifikanten. Sie werden am häufigsten für Delegaten verwendet, bei denen Sie eine Eigenschaft für diesen Delegaten mit dem Attribut weakoder definieren unsafe_unretained( assigneffektiv unsafe_unretained) und diese dann durch Markieren der jeweiligen Instanzvariablen mit __weakoder abgleichen __unsafe_unretained. Dies bedeutet, dass die Delegateninstanzvariable weiterhin auf das erste Objekt verweist, dieses Objekt jedoch nicht beibehalten wird, wodurch der Aufbewahrungszyklus unterbrochen wird und beide Objekte freigegeben werden können.
Abgesehen von Delegierten ist dies nützlich, um andere Aufbewahrungszyklen zu unterbrechen, die sich möglicherweise in Ihrem Code bilden. Das Leaks-Instrument enthält jetzt eine Zyklenansicht, in der die in Ihrer Anwendung erkannten Aufbewahrungszyklen grafisch angezeigt werden.
Beides __unsafe_unretainedund __weakverhindern das Zurückhalten von Objekten, jedoch auf leicht unterschiedliche Weise. Denn __weakder Zeiger auf ein Objekt wird nilbei der Freigabe des Objekts , auf das er zeigt, konvertiert , was ein sehr sicheres Verhalten ist. Wie der Name schon sagt, __unsafe_unretainedwird weiterhin auf den Speicher verwiesen, in dem sich ein Objekt befand, auch nachdem es freigegeben wurde. Dies kann zu Abstürzen führen, wenn auf das freigegebene Objekt zugegriffen wird.
Warum würden Sie dann jemals verwenden __unsafe_unretained? Leider __weakwird nur für iOS 5.0 und Lion als Bereitstellungsziele unterstützt. Wenn Sie auf iOS 4.0 und Snow Leopard zurückgreifen möchten, müssen Sie das __unsafe_unretainedQualifikationsmerkmal oder etwas wie Mike Ashs MAZeroingWeakRef verwenden .
__unsafe_unretainedkann es nützlich sein, C-Arrays vonNSStringKonstanten und dergleichen zu definieren, z. B.NSString __unsafe_unretained *myStrings = { @"Foo", @"Bar", @"Baz", nil };