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