7

¿Es válido usar el modificador de almacenamiento __weak en la firma de implementación de un método? ¿Especialmente si no es parte de la firma pública del método? Por ejemplo:Usando __weak para modificar el almacenamiento de un parámetro en la implementación

- (UIView *)tableView:(__weak UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionIndex 
{ 
    UIView *view = [ABHeaderView view]; 
    view.actionBlock = ^{ 
     [tableView doSomething]; 
    } 
    // ... 
    return view; 
} 

¿Este Utilizar correctamente tableView como un puntero débil? ¿O debería hacer algo como __weak *weakTableView = tableView; y usar weakTableView dentro del bloque?

No recibo ninguna advertencia o error y el analizador estático no arroja ninguna advertencia.

Respuesta

1

No cuente con que los modificadores de almacenamiento o los atributos se respeten 'dinámicamente' cuando el despacho dinámico esté involucrado y anulando (1).

Este método se declara formalmente en UIKit. El compilador puede equivocarse al usar ARC porque puede hacer coincidir el selector con la declaración original cuando se le llama. Es decir, su declaración no es visible para UIKit, y UIKit la tratará como predeterminada/fuerte si también se compila como ARC. Esto podría suceder si las declaraciones no coinciden, o incluso si no son visibles en la traducción del cliente + llamante.

Los tipos/atributos de parámetros no son parte del selector, ni se aplican para el envío dinámico. ARC debería asumir una posición fuerte aquí, y que la llamada contiene la referencia. Este ejemplo específico puede no causar un error de tiempo de ejecución, pero es una práctica cuestionable que supongo que se pueden encontrar errores. He probado esto para los atributos in this answer. Fundamentalmente, es un concepto similar.

Regla simple con despacho objc dinámico: Siempre coincide con la firma de la declaración original al redeclar, definir y anular. La única excepción que se puede hacer es para los calificadores compatibles con C que no alterarían la firma (una práctica muy común en los programas ObjC que yo haya visto).

(1) técnicamente, no es una anulación, sino una implementación del método del protocolo. independientemente, el sig debe ser idéntico.

0

__strong o __weak modificadores de almacenamiento son parte de su implementación interna, hasta donde puedo ver. No influyen en el código generado por la persona que llama del método, por lo que creo que está seguro ahora y muy probablemente en el futuro.

Creo que es un estilo pobre, por lo que su sugerencia de copiar la referencia a una referencia débil parece una buena solución.

Cuestiones relacionadas