Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在Objective C中创建神奇的方法_Objective C_Core Data_Magic Methods - Fatal编程技术网

Objective c 如何在Objective C中创建神奇的方法

Objective c 如何在Objective C中创建神奇的方法,objective-c,core-data,magic-methods,Objective C,Core Data,Magic Methods,我正在尝试在一个通用的模型类中开发一组神奇的findByX方法,最终将使用NSPredicate对象向核心数据发出查询: (id)findByName (id)findByCreated … 根据a的建议,我可以通过重写resolveInstanceMethod,截获请求不存在方法的消息: #include <objc/runtime.h> + (BOOL) resolveInstanceMethod:(SEL)aSel { if (aSel == @selector(re

我正在尝试在一个通用的
模型
类中开发一组神奇的
findByX
方法,最终将使用
NSPredicate
对象向核心数据发出查询:

  • (id)findByName
  • (id)findByCreated
根据a的建议,我可以通过重写
resolveInstanceMethod
,截获请求不存在方法的消息:

#include <objc/runtime.h>

+ (BOOL) resolveInstanceMethod:(SEL)aSel {
  if (aSel == @selector(resolveThisMethodDynamically)) {
    class_addMethod([self class], aSel, (IMP) dynamicMethodIMP, "v@:");
    return YES;
  }
  return [super resolveInstanceMethod:aSel];
}

void dynamicMethodIMP(id self, SEL _cmd) {
  NSLog(@"Voilà");
}
这是有道理的,因为这个方法没有任何声明。那么,我错过了什么?是否有实现这一目标的最佳实践


谢谢大家!

我不确定这是否正是您想要的,但这里有一些关于这种核心数据功能的有用资源:

MagicalRecord是一个用于核心数据的小型框架,它的工作方式与Ruby世界的ActiveRecord非常相似。特别是,我认为它实现了许多您想要的抓取功能。查看它添加到NSManagedObject的类别


希望这有帮助

这让我很好奇,所以我四处搜索,有很多选择。总结一下。就个人而言,我赞同这样一种观点,即如果在运行时添加方法,则不应该在编译时选择选择器,而应该在运行时选择选择器。因此,使用NSSelectorFromString等,以及一些不同的预处理器指令来抑制这种情况下的警告

希望这有帮助

使用

objc_msgSend( myObject, sel_getUid("yourMethod"), param1, param2...);

不要忘记导入“objc/message.h”

这是一个XY问题。有关如何实现findAll功能,请参见RestKit。具体来说,NSManagedObject+ActiveRecord类别。
objc_msgSend( myObject, sel_getUid("yourMethod"), param1, param2...);