問題は、Objective Cの中で永続オブジェクトを作ります
-
18-09-2019 - |
質問
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!)。
明らかに、私はここに非常に間違って何かをやっています。異なる数のビュー・コントローラ(両方がコード化されたとXIB)の間でオブジェクトを共有する簡単な方法はありますか?
解決
なぜNSUserDefaults
やキーホルダーにこの情報を保存しませんか?
他のヒント
あなたの+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:
メッセージを送っています。
あなたは正しく共有インスタンスのパターンを使用していません。あなたのsharedInstance方法は、ALLOCと(それが既に一度行われていない場合)は、新しい人をinitとsharedInstance静的変数に代入する必要があります。
あなたは、人へのポインタを必要とするとき、次に、あなたは共有インスタンスのクラスメソッド、ないのallocを使用して、新しいインスタンスを自分でinitにする必要があります。
あなたが本格的なシングルトンのために行っている場合は、技術的には、あなたのallocメソッドは、人の新しいインスタンスを作成することができないようにしてください。
また、私はあなたのコードを再読み込み、およびWTFのビットに出くわします:
Person * ThePerson = [[Person alloc] init];
ThePerson = nil;
すべてについてということは何ですか?それはすぐそこ、メモリリークです。
すべてのあなたの問題はPerson *thePerson = [[Person alloc] init];
でPerson *person = [Person sharedInstance];
の任意およびすべての行を交換することによって解決することができます。
あなたのinitはあなたが人のfirstNameのを設定する場合は、このようにそれを行う、hinkyです。
Person *thePerson = [Person sharedInstance];
thePerson.name = @"John Public";
の名前を取得するには、
NSString *personName = [[Person sharedInstance] name];
"Person.h"
を#imports任意のクラスで動作すること