2009-10-15 44 views
0

可可新手在這裏。我正在開發基於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]; 
} 

這對大多數對象都可以正常工作,但傳入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。

我可以訪問這些setter方法與@selector但沒有明確定義它們

+0

爲什麼你需要爲此使用NSInvocation? – 2009-10-15 02:08:07

+1

澄清:NSObject的performSelector系列消息以何種方式不適合您的需求?很少有人需要使用NSInvocation,我也沒有看到任何理由說明你會成爲這個片段中的一員。 – 2009-10-15 02:34:20

回答

1

同意瓦特/ NSD這裏,您應該通過簡化此代碼更簡單的-performSelector:withObject:版本開始:?

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

如果仍然有問題,我們可以開始調試真正的問題。 NSInvocation是解決這種簡單問題的一個非常花哨的對象。

如果仍然出現崩潰,那麼您需要查看實際的堆棧跟蹤,以查看未正確初始化或過度釋放的變量。

+0

借調。而且EXEC_BAD_ACCESS幾乎總是在一個已經發布的對象上調用一個方法。 (也許一個指針超過了它的託管對象上下文或什麼東西?) – 2009-10-15 05:14:39

+0

哇,我不敢相信我沒有深入挖掘一點,找到更簡單的方法。它似乎過於複雜,但我被鎖定在NSInvocation上。此方法似乎消除了EXC_BAD_ACCESS錯誤。簡單,優雅和工作。我喜歡!感謝大家。 – kevindayton 2009-10-15 12:30:14

相關問題