en xcode6 gold master, usar objc_msgSend ahora arroja un error de syntax que indica que el número de arguments es incorrecto

id<MyProtocol> topLayoutGuideObj = objc_msgSend(viewController, @selector(myselector)); 

"Demasiados arguments para ejecutar llamadas, esperados 0, tienen 2"

Sin embargo, la firma de function para objc_msgSend se ve así:

 #if !OBJC_OLD_DISPATCH_PROTOTYPES OBJC_EXPORT void objc_msgSend(void /* id self, SEL op, ... */ ) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ ) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); #else /** * Sends a message with a simple return value to an instance of a class. * * @param self A pointer to the instance of the class that is to receive the message. * @param op The selector of the method that handles the message. * @param ... * A variable argument list containing the arguments to the method. * * @return The return value of the method. * * @note When it encounters a method call, the compiler generates a call to one of the * functions \c objc_msgSend, \c objc_msgSend_stret, \c objc_msgSendSuper, or \c objc_msgSendSuper_stret. * Messages sent to an object's superclass (using the \c super keyword) are sent using \c objc_msgSendSuper; * other messages are sent using \c objc_msgSend. Methods that have data structures as return values * are sent using \c objc_msgSendSuper_stret and \c objc_msgSend_stret. */ OBJC_EXPORT id objc_msgSend(id self, SEL op, ...) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); 

Los arguments son "vacíos" o variadicos?! No entiendo cómo se supone que debo llamar a esto.

Mira solo algunas líneas arriba de las que te refieres.

  /* * ... * * These functions must be cast to an appropriate function pointer type * before being called. */ 

Puedes llamarlo como:

 #import <objc/runtime.h> #import <objc/message.h> id<MyProtocol> topLayoutGuideObj = ((id (*)(id, SEL))objc_msgSend)(viewController, @selector(myselector)); 

O

 id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend; id<MyProtocol> topLayoutGuideObj = typed_msgSend(viewController, @selector(myselector)); 

Lo he comprobado, el problema principal fue como @Jerry Krinock dijo en comentario de respuesta aceptada;

  1. Vaya a la configuration de generación de su proyecto
  2. Buscar objc_msgSend
  3. Establezca su valor en "No" en lugar de "Sí"

si ocurre en un cocoapod lib, solo tiene que actualizar al cocoapods 36.1 al less. Si no puede hacer eso, agregue el siguiente código al final de su podfile:

(reemplace AFNetworking con el pod donde vea esos errores)

 when /AFNetworking/ target.build_configurations.each do |config| config.build_settings['ENABLE_STRICT_OBJC_MSGSEND'] = "NO" end