代码之家  ›  专栏  ›  技术社区  ›  kevindayton

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

  •  0
  • kevindayton  · 技术社区  · 16 年前

    这里是可可新手。我正在开发一个基于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];
    }
    

    交易。h

    #import <CoreData/CoreData.h>
    
    @interface Transaction :  NSManagedObject  
    {
    }
    
    @property (nonatomic, retain) NSString * message;
    @property (nonatomic, retain) NSDate * date;
    
    @end
    

    交易。米

    #import "Transaction.h"
    
    @implementation Transaction 
    
    @dynamic message;
    @dynamic date;
    
    @end
    

    [targetObject setDate:[datePicker date]];
    

    EXC_BAD_ACCESS

    我想这与NSManagedObject中使用的@dynamic方法以及创建它们的时间有关,但我对这个过程了解不够,不知道如何或是否可以解决这个问题以使其正常工作。我曾尝试在Transaction对象中显式创建“setDate:(NSDate*)aDate”方法,该方法有效,但我想知道我是否应该这样做,以及它对NSManagedObject有何影响。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Rob Napier    16 年前

    -performSelector:withObject:

    - (IBAction)saveDate:(id)sender {
          [self.targetObject performSelector:self.doneSelector withObject:[self.datePicker date]];
    }
    

    如果仍然有问题,我们可以开始调试真正的问题所在。 NSInvocation 是解决这类简单问题的一个非常奇特的对象。

    如果你仍然遇到崩溃,那么你需要查看实际的堆栈跟踪,看看哪些变量没有正确初始化或被过度释放。