2011-12-07 43 views
0

好吧,我想了解這個post關於從一個視圖控制器到其他數據傳輸的最佳方式。iphone委託協議無法保存對象

事情是,如果我想設置對象的attr它的作品像冠軍。如果我嘗試設置整個對象,它不會這樣做。

我的代碼是:

@protocol AppDelegateProtocol 

    - (Lote*) theLoteAppObject; 

@end 

上的AppDelegate:

@interface AgroferiaAppDelegate : NSObject <UIApplicationDelegate, AppDelegateProtocol> { 
Lote *theLoteAppObject; 

} 

@property (nonatomic, retain) Lote *theLoteAppObject; 

@end 
... 
... 
- (id) init; 
{ 
self.theLoteAppObject = [[Lote alloc] init]; 
[theLoteAppObject release]; 
return [super init]; 
} 

類在那裏我得到這個問題(的UIViewController):

-(void)tableView:(UITableView *) aTableView didSelectRowAtIndexPath:(NSIndexPath *) indexPax{ 

... 

NSArray *lotes = [[self.evento lotesStore]allLotes] ; 

Lote* theDataObject = [self theLoteAppObject]; 

theDataObject._id = [[lotes objectAtIndex:[indexPax row]]_id]; 
[[self navigationController]pushViewController:lotesOpViewController animated:YES]; 

} 
- (Lote*) theLoteAppObject;{ 
id<AppDelegateProtocol> theDelegate = (id<AppDelegateProtocol>) [UIApplication sharedApplication].delegate; 
Lote* theDataObject; 
theDataObject = (Lote*) theDelegate.theLoteAppObject; 
return theDataObject; 
    } 

,這樣的作品,但如果我想做下面的事情,

theDataObject = [lotes objectAtIndex:[indexPax row]]; 

它不保存數據對象上的對象。

這是一個糟糕的內存管理問題嗎?

編輯:是它的數據對象從AppDelegate的參考?或者這是問題?

+0

我猜你陣列中的所有Lote物品都是自動釋放的。檢查你的'[lotes objectAtIndex:[indexPax row]];'返回的對象是否是一個有效的Lote對象,如果是,則對其進行「複製」。 –

+0

atm做objectAtIndex我可以看到對象在那裏,並與他的所有信息。所以你建議我必須複製他。新問題,在這種情況下做到這一點的最佳方式? –

+0

想添加,是否可以,如果我創建一個方法initWithLote:(Lote *)copyLote在Lote類中,我做了深層複製,如果他的所有attr? –

回答

1

嘗試這樣:

if([indexPax row] < [lotes count]) 
{ 
    Lotes * dataObjectToCopy = [lotes objectAtIndex: [indexPax row]]; 
    if(dataObjectToCopy) 
    { 
     theDataObject = [dataObjectToCopy copy]; 
    } 
} 

這將創建一個單獨的,保留你的Lote對象的副本。確保在完成後釋放它(如果您不使用ARC)。

+0

ARC是[自動引用計數](http://clang.llvm.org/docs/AutomaticReferenceCounting.html)。我修改了我的原始答案,以顯示更簡單的代碼。如果你仍然看到一個「copyWithZone」無法識別的選擇器錯誤,那麼它可能是其他的錯誤。 –

+0

我做了副本,但當我在代理上查找該對象時,我得到零,所以沒有被設置爲appDelegate:S後的DataObject._id = [[lotes objectAtIndex:[indexPax row]] _ id];我不需要做其他事情?與此同時我爲appDelegate和整個應用程序設置了對象? –

+1

邁克爾,他不需要符合'NSCopying'並實現'copyWithZone:'? – jstevenco