簡體   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