[英]How do I call NSManaged object's @dynamic method from from another object using a @selector and NSInvocation?
可可新手在这里。 我正在使用基于iPhone UITableViewController的小部件,该小部件可用于在初始化期间编辑对象集中的日期和文本属性。 目前,我正在尝试使用@selector和NSInvocation进行以下操作。 注意 :“ targetObject”是初始化控制器时设置的对象。
- (IBAction)saveDate:(id)sender {
//The selector below would normally be passed in when the controller is initialized
[self setDoneSelector:@selector(setDate:)];
NSMethodSignature * sig = nil;
sig = [[targetObject class] instanceMethodSignatureForSelector:[self doneSelector]];
NSInvocation * myInvocation = nil;
myInvocation = [NSInvocation invocationWithMethodSignature:sig];
[myInvocation setTarget:targetObject];
[myInvocation setSelector:doneSelector];
NSDate * myDate = [datePicker date];
[myInvocation setArgument:&myDate atIndex:2];
NSString * result = nil;
[myInvocation retainArguments];
[myInvocation invoke];
}
这在大多数对象上都能正常工作,但是在将Core Data(NSManagedObject)作为targetObject传递时遇到麻烦。 该对象如下所示:
Transaction.h
#import <CoreData/CoreData.h>
@interface Transaction : NSManagedObject
{
}
@property (nonatomic, retain) NSString * message;
@property (nonatomic, retain) NSDate * date;
@end
Transaction.m
#import "Transaction.h"
@implementation Transaction
@dynamic message;
@dynamic date;
@end
如果我在控制器中将此对象设置为targetObject,则可以直接调用“ setDate:”方法而不会出现问题。
[targetObject setDate:[datePicker date]];
但是,当我尝试使用@selector调用它时,会收到“程序收到的信号:“ EXC_BAD_ACCESS
”。
我想这与NSManagedObject中使用的@dynamic方法以及创建它们的时间有关,但是我对该过程了解不足,无法知道如何或者是否可以解决该问题以使其正常工作。 我尝试在Transaction对象中显式创建“ setDate:(NSDate *)aDate”方法,该方法有效,但是我想知道是否应该这样做以及NSManagedObject如何。
我可以在不显式定义它们的情况下使用@selector访问这些setter方法吗?
在此处同意使用NSD。 您应该首先将该代码简化为更简单的-performSelector:withObject:
版本:
- (IBAction)saveDate:(id)sender {
[self.targetObject performSelector:self.doneSelector withObject:[self.datePicker date]];
}
如果仍然有问题,我们可以开始调试真正的问题所在。 NSInvocation
是解决此类简单问题的非常理想的对象。
如果仍然崩溃,那么您将需要查看实际的堆栈跟踪,以查看未正确初始化或过度释放的变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.