1

アプリケーションのログイン詳細を保持する 'Person' という名前の NSObject を作成しようとしています (空想することは何もありません)。アプリは、複数のテーブル ビューを持つナビゲーション コントローラーで構成されていますが、Person オブジェクトの共有に問題があります。

次のような静的オブジェクトを作成しようとしました:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    @synchronized(self) {
        if(!sharedInstance)
            sharedInstance = [[Person alloc] init];
        return sharedInstance;
    }
    return nil;
}

そしてヘッダーはこちら

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject {

    NSString    *fullName;
    NSString    *firstName;
    NSString    *lastName;
    NSString    *mobileNumber;
    NSString    *userPassword;
}

@property(nonatomic, retain) NSString   *fullName;
@property(nonatomic, retain) NSString   *firstName;
@property(nonatomic, retain) NSString   *lastName;
@property(nonatomic, retain) NSString   *mobileNumber;
@property(nonatomic, retain) NSString   *userPassword;

+ (Person *)sharedInstance;
-(BOOL) setName:(NSString*) fname;
-(BOOL) setMob:(NSString*) mnum;
-(BOOL) setPass:(NSString*) pwd;

@end

このオブジェクト セッターとゲッターは、アプリケーションのさまざまな部分で必要になります。私はこのようにそれらにアクセスしようとしています

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
NSString * PersonsName;
PersonsName = [[Person sharedInstance] firstName];

ログイン画面ではすべてがうまく機能しますが、次の使用時に機能しなくなります。通常は EXC_BAD_ACCESS (eek!)。

明らかに、私はここで非常に間違ったことをしています。異なる数のView Controller(コード化されたものとxibの両方)の間でオブジェクトを共有する簡単な方法はありますか?

4

4 に答える 4

3

この情報をNSUserDefaultsまたはキーチェーンに保存してみませんか?

于 2010-03-08T15:04:57.403 に答える
2

メソッドは、共有インスタンスを返す必要があるときに+sharedInstance戻ります。nilまた、そのブロックで同期する価値があるとは思えません。メソッドはもっと簡単に書くことができます:

+ (Person *)sharedInstance {
    static Person *sharedInstance;
    if(!sharedInstance) {
        sharedInstance = [[Person alloc] init];
    }
    return sharedInstance;
}

Objective-Cにはそのようなものがないため、これは「静的オブジェクト」を作成しないことに注意してください。オブジェクトを静的変数に割り当てるだけです(おそらくあなたが意図したことですが、確認したかっただけです)。

ナビゲーション コントローラ内の 2 つ以上のビュー コントローラ間でオブジェクトを共有する別の方法は、ネストされたビュー コントローラにプロパティを追加し、ナビゲートする前にセッター メソッドを呼び出すことです。たとえば、次のようなプロパティを追加できます。

@property (nonatomic, retain) Book *book;

ルート ビュー コントローラの子に送信-setBook:し、ルート ビュー コントローラの-tableView:didSelectRowAtIndexPath:メソッドでメッセージを送信します。

于 2010-03-08T15:55:38.473 に答える
0

共有インスタンス パターンを正しく使用していません。sharedInstance メソッドは、新しい Person を割り当てて初期化し (まだ一度も行われていない場合)、それを sharedInstance 静的変数に割り当てる必要があります。

次に、人へのポインタが必要な場合は、新しいインスタンスを自分で割り当てて初期化するのではなく、共有インスタンス クラス メソッドを使用する必要があります。

技術的には、本格的なシングルトンを作成する場合、 alloc メソッドで Person の新しいインスタンスを作成できないようにする必要があります。

また、あなたのコードを読み直したところ、ちょっとした WTF に出くわしました。

Person * ThePerson = [[Person alloc] init];
ThePerson = nil;

それは一体何ですか?それはメモリリークです。

Person *thePerson = [[Person alloc] init];すべての問題は、のすべての行をに置き換えることで解決できますPerson *person = [Person sharedInstance];

于 2010-03-08T15:31:26.733 に答える
0

あなたのinitはヒンキーです.PersonのfirstNameを設定したい場合は、このようにします

Person *thePerson = [Person sharedInstance];  
thePerson.name = @"John Public";

名前を出すために、

NSString *personName = [[Person sharedInstance] name];  

これは、#imports "Person.h" を使用するすべてのクラスで機能します。

于 2010-03-08T15:32:30.583 に答える