繁体   English   中英

如何使用@selector和NSInvocation从另一个对象中调用NSManaged对象的@dynamic方法?

[英]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.

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