acabo de venir a través de un código de Three20 que tiene este aspecto:¿Por qué utilizar performSelector: withObject: withObject en tiempo de ejecución si conoce tanto el selector como sus argumentos en tiempo de compilación?
SEL sel = @selector(textField:didAddCellAtIndex:);
if ([self.delegate respondsToSelector:sel]) {
[self.delegate performSelector:sel withObject:self withObject:(id)_cellViews.count-1];
}
En LLVM 2.0, esto hace que el error de compilación:
error: arithmetic on pointer to interface 'id', which is not a constant size in non-fragile ABI
sé por qué ese error está ocurriendo y yo saber cómo solucionarlo Sólo necesito para invocar el método directamente, así:
SEL sel = @selector(textField:didAddCellAtIndex:);
if ([self.delegate respondsToSelector:sel]) {
[self.delegate textField:self didAddCellAtIndex:(_cellViews.count - 1)];
}
Mi pregunta es, si sabes tanto el selector y sus argumentos en tiempo de compilación, ¿por qué se necesita para utilizar performSelector:withObject:withObject:
en tiempo de ejecución? No veo por qué el código fue escrito de esta manera en primer lugar. Si el selector y los argumentos se pasaron dinámicamente al método, puedo entender, pero no lo están, el selector y sus argumentos están codificados de forma rígida (incluso si el índice cambia durante el tiempo de ejecución, su método para obtener el índice es difícil codificado.)
Si alguien pudiera explicarme una buena razón por la que esto sería necesario, estaría agradecido. De lo contrario, estaré aquí cambiando todo este código.
Three20 no debe estar pasando un valor entero como un puntero. Travieso Travieso. Gracias por la corrección. – justice