【发布时间】: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