Editar: Mi respuesta anterior era probable mal.
Algunos extractos seleccionados de entre el ARC docs dicen:
3. punteros a objetos retainable
Un puntero de objeto puede retener (o puntero retainable) es un valor de un tipo puntero de objeto puede retener (tipo retainable). Hay tres clases de tipos de puntero objeto retainable:
- punteros de bloques (formados mediante la aplicación de la intercalación (^) sigil declarador a un tipo de función)
4,2. Semántica
La asignación se produce al evaluar un operador de asignación. La semántica varía en función de la calificación:
- Para objetos __strong, el primer punto se conserva por primera vez; segundo, el lvalue está cargado de semántica primitiva; tercero, el nuevo punto se almacena en el valor l con semántica primitiva; y finalmente, el viejo pointee es lanzado. Esto no se realiza atómicamente; la sincronización externa se debe usar para hacer esto seguro frente a cargas y tiendas concurrentes.
4.4.1.Objetos
Si un objeto se declara con un tipo de propietario de objeto retenible, pero sin un calificador de propiedad explícito, su tipo se ajusta implícitamente para tener una calificación __strong.
7.5. Bloques
Con la excepción de retener como parte de la inicialización de una variable de parámetro __strong o de la lectura de una variable __weak, siempre que estas semánticas pidan conservar un valor de tipo block-pointer, tiene el efecto de un Block_copy. El optimizador puede eliminar dichas copias cuando ve que el resultado se usa solo como argumento para una llamada.
Así que creo que la respuesta es quizás, dependiendo del optimizador.
Acepto que no está claro qué "semántica" se refiere a – sbooth
+1, la redacción de la sección es increíblemente confusa. – orip
Hablé con el ingeniero de Apple que escribió esta sección. Dijo que "esta semántica" se refiere a todo el documento. Por lo tanto, un 'Block_copy' debe insertarse automáticamente. Parece que tal vez esto fue un error al principio con bloques que luego se corrigieron. – bearMountain