코코아 새내기는 여기에 있습니다. 내가 시작하는 동안 설정된 객체의 날짜 및 텍스트 속성을 편집하는 데 사용할 수있는 iPhone UITableViewController 기반 위젯에 대해 작업하고 있습니다. 현재, 아래와 같이 @selector 및 NSInvocation을 사용하여이 작업을 시도하고 있습니다. 참고 : "targetObject"는 컨트롤러가 초기화 될 때 설정된 객체입니다.@selector와 NSInvocation을 사용하여 다른 개체에서 NSManaged 개체의 @dynamic 메서드를 호출하려면 어떻게해야합니까?
- (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];
}
이것은 대부분의 개체에서 잘 작동하지만 핵심 데이터 (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]];
그러나 내가 @ 선택기로 호출 할 때, 내가 할 '프로그램은 신호를 수신 :. "EXC_BAD_ACCESS
"를'
이것은 NSManagedObject에서 사용 된 @dynamic 메소드와 관련이 있다고 상상해 봅니다. 그러나 NSManagedObject를 생성 할 때 그 메소드에 대해 충분히 알지 못합니다. 명시 적으로 "setDate : (NSDate *) aDate"메서드를 트랜잭션 개체에 만들려고했는데 작동하지만 그 작업을 수행해야하는 경우 그리고 NSManagedObject가 어떻게 될지 궁금합니다.
@selector를 명시 적으로 정의하지 않고 setter 메서드를 사용하면됩니다.
왜 NSInvocation을 사용해야합니까? –
명확히하기 : NSObject의 performSelector 메시지 패밀리가 고객의 요구에 부적합한 방법은 무엇입니까? NSInvocation을 사용할 필요가있는 사람은 극히 드물며,이 스 니펫에서 왜 당신이 그 중 한 명일 수는 없는지는 알 수 없습니다. –