2011-03-11 10 views
0

私はWLAN経由でOSCメッセージを送信するためのアプリをビルドします。
私はなぜそれが単一のオブジェクトで "ネットワーク"エンティティを持っている。このため、シングルトンがこのオブジェクトを取得したい。 AppDelegateで
私はManagedObjectContextシングルトンがCoreDataをフェッチすると[fetchedResultsController_ performFetch:&error]がクラッシュする

static NSManagedObjectContext* manObCon; 

@implementation... 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    manObCon = self.managedObjectContext; 
... 
} 

+ (NSManagedObjectContext*) getManObCon{ 
    return manObCon; 
} 

を取得するクラスメソッドを作成しmanagedObjectContextは私のシングルトンのアドレスに到着したので、私はそれが動作するはずだと思います。
Singleton.h(ここでは何も特別な)

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 
#import "OSC_iPadAppDelegate.h"; 
#import "Network.h"; 

@interface NetworkSingleton : NSObject <NSFetchedResultsControllerDelegate> { 
} 
+ (Network*) getNetwork; 
+ (void) insertNewObject; 
+ (NSFetchedResultsController *)fetchedResultsController; 
@end 

Singleton.m APPは

warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/usr/lib/info/dns.so (file not found). 
Program received signal: “EXC_BAD_ACCESS”. 
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found). 
kill 
quit 

[fetchedResultsController_ performFetch:&error] ATクラッシュSingleton.m

の相続コード
#import "NetworkSingleton.h" 
static Network* _network; 
static NSFetchedResultsController *fetchedResultsController_; 
static NSManagedObjectContext *managedObjectContext_; 

@implementation NetworkSingleton 

+ (Network*) getNetwork{ 
    managedObjectContext_ = [OSC_iPadAppDelegate getManObCon]; //get the managedObjectContex from AppDelegate 
//fetchedResultsController init 
    fetchedResultsController_ = [NetworkSingleton fetchedResultsController]; //get fetchedResultsController 
//check if _network is set 
    if (_network == nil) { 
     id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController_ sections] objectAtIndex:0]; 
//if not set, check if there is already an network object in coredata 
     if ([sectionInfo numberOfObjects] == 0) { 
      //Create new Networkobject, if no one is existing 
      [NetworkSingleton insertNewObject]; 
      fetchedResultsController_ = nil; 
     } 
//set _network 
     _network = [fetchedResultsController_ objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
    } 
    return _network; 
} 

+ (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Network" inManagedObjectContext: managedObjectContext_]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setFetchBatchSize:1]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sourcePort" ascending:YES selector:nil]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    fetchedResultsController_ = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [fetchRequest release]; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 

    NSError *error = nil; 
    /* 
    APP CRASHES HER 
    */ 
    if (![fetchedResultsController_ performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return fetchedResultsController_; 
}  
@end 

ので、私は知りませんなぜfetchedResultsController_が彼がベストを尽くしていないのか - 取ってくる
それはゼロではありませんが、私はできませんErrormessageを理解し、Googleや他のどこかに何も見つからない。
問題は、私自身がfetchedResultsControllerを初期化する必要があります。なぜなら、生成されたビューコントローラのように自動的にinitを実行しないからです。あなたの助けを

おかげ

+0

これは貧弱な設計です。 fetchedResultsControllerは、コアデータモデルレイヤーとUITableViewビューレイヤーの間のコントローラーを意図しています。それは、シングルトンモデルオブジェクトによって保持されることをFRCの目的に反する。あなたはモデルを壊してレイヤーを一緒にコントロールし、テーブルビューをデータにハードコードしました。 – TechZen

+0

私はこの場合、TableViewとして使用しません。ビューではない多くのクラスのデータを使用するため、シングルトンが必要です。 しかし、CoreDataを使用せずに1つのインスタンスを保存するにはどうすればよいですか? – Seega

答えて

3
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext_ sectionNameKeyPath:nil cacheName:nil]; 

fetchedResultsController_ = aFetchedResultsController; 

[aFetchedResultsController release]; 

あなたはそれがすでにリリースされたコードのこのブロックの後fetchedResultsController_を使用しています。あなたはそれを割り当てたので(retainCount + 1)、それから解放しました(retainCount-1)。 aFetchedResultsControllerをfetchedResultsController_に代入したときは、保持しませんでした。

いずれかのこのfetchedResultsController_ = [aFetchedResultsController retain];
または[aFetchedResultsController release];


行を削除EDITようにそれを保持している:私はちょうどあなたのコードでは、より間違っているがあるかもしれないことを見ました。

fetchedResultsControllerゲッターの外にあるfetchedResultsController_をすべてself.fetchedResultsControllerに置き換える必要があります。通常、変数の後ろまたは前には、何をしているのか分からない限り、setterとgetterを使うべきだということが伝えられます。

fetchedResultsController_ = [NetworkSingleton fetchedResultsController];fetchedResultsController_ = aFetchedResultsController;を呼び出します。
これはうまくいくかもしれませんが、私はそれをしません。

+0

'[aFetchedResultsController release];'が問題でした。 'self.fetchedResultsController'の問題では、属性がプライベートで、私はクラス自体でそれを使用しているので、問題はありません – Seega

関連する問題