【问题标题】:How to write really dynamic methods in Objective-C?如何在 Objective-C 中编写真正动态的方法?
【发布时间】:2013-10-20 23:15:18
【问题描述】:

I have just started to develop this library

它的主要目标是允许程序员编写像句子一样的方法名称来使用 Core Data。

例子:

[moc RD_createUserWithName:@"John" age:@29 married:@YES];
[moc RD_createCompanyWithName:@"Yandex, LLC" ceo:me managers:@[firstManager, secondManager]];
[moc RD_createCompanyWithName:@"Google" ceos:@[larryPage, sergeyBrin] manager:jonathanGreen];
[moc RD_createBookWithAuthor:joanneRowling name:@"Harry Potter" publishedAt:[NSDate date]];
[moc RD_createTaskForProject:googleTalk priority:@3 members:nil];
[moc RD_createArticleAboutUser:alizar withName:@"Alizar - Habrahabr Soul" andTitle:@"Alizar"];

或寻找对象:

NSArray* mos = [moc RD_findUsersWithFirstName:@"Igori"];
NSManagedObject* mo = [moc RD_findUserWithLastName:@"Guliko" firstName:@"Igori"];
NSArray* mos = [moc RD_findBooksPublishedAt:[NSDate date]];
NSArray* mos = [moc RD_findFriendsLastSeenAt:[NSDate date]];
NSArray* mos = [moc RD_findBooksPublishedAfter:[NSDate date]];
NSArray* mos = [moc RD_findBooksPublishedBefore:[NSDate date]];
NSManagedObject* mo = [moc RD_findStudentCreatedBefore:[NSDate date] emailLike:@"*@gmail.com"];
NSArray* mos = [moc RD_findCompaniesRegisteredAfter:[NSDate date] limit:@10 offset:@1];
NSArray* mos = [moc RD_findClientsAddedBetween:@[startDate, endDate]];
NSArray* mos = [moc RD_findStudentsWithAgeBetween:@[@18, @28]]; // plural
NSManagedObject *mo = [moc RD_findStudentWithAgeBetween:@[@18, @28]]; // singular
NSArray* mos = [moc RD_findUsersWithGender:@[@"Male", @"Female"] lastNameLike:@"*ir*"  ageBetween:@[@18, @29]];
NSArray* mos = [moc RD_findCarsWithFuelVolumeGreaterThan:@10];
NSArray* mos = [moc RD_findMessagesWithPositiveVotesSmallerThan:@29];

但如果不关闭 ARC,我无法让它工作。 (上一问:Error compiling with ARC when runtime programming dynamic method)。

来自邮件列表:

我们的推理分为大约 50/50:(1)需要更加小心类型和所有权,以及(2)希望消除语言中令人尴尬的缺陷(不允许抱怨完全未知的方法)比警告更费劲)。确实没有正当理由调用甚至没有在某处声明的方法。这样做的能力会导致一些非常微不足道的错误(例如选择器中的拼写错误)运行时失败而不是编译失败。我们一直对此提出警告。修正你的代码。

那么,Objective-C 不再是真正的具有动态方法的 Objective-C 了吗?

现在是否可以在 RubyDavidson 中实现我想要的功能?

【问题讨论】:

  • class_getInstanceMethod()- [NSObject performSelector] 和其他人来救援。
  • @H2CO3, no-no) 我想让程序员在他的源代码中编写这样的代码,之后,当应用程序运行时,这些方法将在 forwardInvocation: 中解析并创建正确的实体或查找从方法名称中获取的正确实体。
  • 这些方法如何阻止您这样做?
  • 对于 ARC,编译不接受 [foo someMethod] 如果“someMethod”未在某处(在接口或协议中)声明。这就是我在回答您所链接的问题时所写的内容,并且情况没有改变。 Apple 邮件列表中的帖子表明,这是编译器人员深思熟虑的决定。
  • @AndrewShmig:我不能告诉你更多关于苹果邮件列表中所说的原因:1)ARC需要了解内存语义(嗯,实际上只有内存语义返回值是相关的!) - 2)这样做的能力会导致一些非常微不足道的错误(例如选择器中的拼写错误)运行时失败而不是编译失败。

标签: objective-c automatic-ref-counting dynamic-method


【解决方案1】:

使用动态方法你必须解决两个问题:运行时的存在,这似乎已解决,以及编译器的存在。 “否”是您问题的错误答案,因为您可以解决该问题。

有两种技术可以做到这一点:

A.将它们放在接收者的类别中。然后你有一个声明。用它。这称为非正式协议。它从一开始就在 Cocoa 中使用。

B.将它们放入协议中并使其成为可选的。然后你有一个声明。用它。这称为正式协议。

【讨论】:

  • 将它们归入一个类别?如果我不知道程序员可以在 RubyDavidson 中使用的所有可能的方法名称,我该怎么做?
  • 啊,你甚至不知道那里可能使用的方法?当我有这样的模式时,我让用户——他明确知道方法,他想使用——将方法放在协议中并导入。
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2012-01-23
  • 2010-10-22
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多