문제

내 애플리케이션에 대한 로그인 세부 정보를 보관할 '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

이 객체 setter 및 getter는 애플리케이션의 다른 부분에 필요합니다.나는 이런 식으로 액세스하려고 시도했습니다.

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에는 그런 것이 없기 때문에 이것은 '정적 객체'를 생성하지 않는다는 점에 유의하십시오.단지 객체를 정적 변수에 할당하는 것뿐입니다(아마도 의도한 것이지만 확인하고 싶었을 것입니다).

탐색 컨트롤러 내 두 개 이상의 보기 컨트롤러 간에 객체를 공유하는 또 다른 방법은 중첩된 보기 컨트롤러에 속성을 추가하고 탐색하기 전에 setter 메서드를 호출하는 것입니다.예를 들어 다음과 같은 속성을 추가할 수 있습니다.

@property (nonatomic, retain) Book *book;

루트 뷰 컨트롤러의 자식에게 보내고 -setBook: 루트 뷰 컨트롤러의 메시지 -tableView:didSelectRowAtIndexPath: 방법.

공유 인스턴스 패턴을 올바르게 사용하고 있지 않습니다.sharedInstance 메소드는 새 Person을 할당 및 초기화하고(아직 한 번 수행되지 않은 경우) 이를 sharedInstance 정적 변수에 할당해야 합니다.

그런 다음 해당 사람에 대한 포인터가 필요할 때 새 인스턴스를 직접 할당하고 초기화하는 것이 아니라 공유 인스턴스 클래스 메서드를 사용해야 합니다.

기술적으로 완전한 싱글톤을 구현하려는 경우 할당 방법을 사용하면 Person의 새 인스턴스를 생성할 수 없어야 합니다.

또한 방금 귀하의 코드를 다시 읽었으며 약간의 WTF를 발견했습니다.

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

그게 다 뭐야?바로 메모리 누수입니다.

귀하의 모든 문제는 모든 라인을 교체함으로써 해결될 수 있습니다. Person *thePerson = [[Person alloc] init]; ~와 함께 Person *person = [Person sharedInstance];

귀하의 초기화는 hinky입니다. Person의 firstName을 설정하려면 다음과 같이 하십시오.

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

이름을 알아내려고,

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

#imports "Person.h"를 사용하는 모든 클래스에서 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top