проблемы делают постоянным объектом в Задаче C - PullRequest
1 голос
/ 08 марта 2010

Попытка создать объект NSO с именем «Person», в котором будут храниться данные для входа в мое приложение (ничего особенного). Приложение состоит из контроллера навигации с несколькими представлениями таблиц, но у меня возникают проблемы при совместном использовании объекта 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)?

Ответы [ 4 ]

3 голосов
/ 08 марта 2010

Почему бы не сохранить эту информацию в NSUserDefaults или связке ключей?

2 голосов
/ 08 марта 2010

Ваш метод +sharedInstance возвращает nil, когда он должен возвращать общий экземпляр. Кроме того, я сомневаюсь, что есть какая-то ценность для синхронизации в этом блоке. Метод можно написать проще:

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

Обратите внимание, что это не создает «статический объект», поскольку в Objective-C такого нет; он просто назначает объект статической переменной (возможно, то, что вы имели в виду, но просто хотел убедиться).

Другой способ поделиться объектом между двумя или более контроллерами представления в контроллере навигации - добавить свойство во вложенные контроллеры представления и вызвать метод установки перед навигацией. Например, вы можете добавить свойство, например, следующее:

@property (nonatomic, retain) Book *book;

дочернему элементу корневого контроллера представления и отправьте ему сообщение -setBook: в методе -tableView:didSelectRowAtIndexPath: корневого контроллера представления.

0 голосов
/ 08 марта 2010

Ваш инициал странный, если вы хотите установить firstName of Person, сделайте это так

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

чтобы получить имя,

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

Это будет работать в любом классе, который #imports "Person.h"

0 голосов
/ 08 марта 2010

Вы не используете шаблон общего экземпляра правильно. Ваш метод sharedInstance должен выделить и инициировать нового пользователя (если это не было сделано один раз) и назначить его статической переменной sharedInstance.

Тогда, когда вам нужен указатель на этого человека, вы должны использовать метод класса общего экземпляра, а не размещать и инициировать новый экземпляр самостоятельно.

Технически, если вы собираетесь использовать полноценный синглтон, ваш метод alloc не должен позволять вам создавать новый экземпляр Person.

Кроме того, я просто перечитал ваш код и наткнулся на что-то вроде WTF:

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

О чем это все? Это утечка памяти, прямо там.

Все ваши проблемы можно решить, заменив все строки Person *thePerson = [[Person alloc] init]; на Person *person = [Person sharedInstance];

...