繁体   English   中英

如何在Objective C中创建魔术方法

[英]How to create magic methods in Objective C

我正在尝试在通用Model类中开发一组神奇的findByX方法, findByX方法最终将使用NSPredicate对象向Core Data发出查询:

  • (id)findByName;
  • (id)findByCreated;
  • ...

遵循上一个SO问题的建议,我可以通过重写resolveInstanceMethod来拦截请求不存在的方法的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à");
}

但是,当我尝试使用[myObject resolveThisMethodDynamically] ,编译器会引发以下错误:

"No visible @interface for 'MyModel' declares the selector 'resolveThisMethodDynamically'"

这是有道理的,因为没有该方法的任何声明。 那么,我在这里想念什么? 是否有最佳实践来实现这一目标?

谢谢!

我不确定这是否正是您所追求的,但是这里有一些关于此类Core Data功能的有用资源:

MagicalRecord是用于Core Data的小型框架,使其工作原理与Ruby世界中的ActiveRecord十分相似。 我认为,尤其是它实现了您所追求的许多获取功能。 检查它添加到NSManagedObject的类别。

希望这可以帮助!

这让我感到很好奇,因此我四处搜寻,并且有很多选择。 该线程将它们汇总。 就我个人而言,我支持这样的论点:如果在运行时添加方法,则不应在编译时选择选择器,而应在运行时也这样做。 因此,请使用NSSelectorFromString等,并结合一些各种预处理程序指令来抑制这种情况下的警告。

希望这可以帮助!

采用

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

不要忘记导入'objc / message.h'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM