Сеттер в NSString iOS

привет, я новичок в ios dev, я пытаюсь установить значение для nsstring из класса делегата и доступ из другого класса, значение, которое я получаю, равно null. я не знаю, какую ошибку я делаю?

//token class header file
@interface TokenClass : NSObject
{
    NSString *tokenValue;
}
@property (nonatomic,strong) NSString *tokenValue;

//token class main file
@implementation TokenClass
@synthesize tokenValue;
@end

//App Delegate
TokenClass *token = [[TokenClass alloc]init];
[token setTokenValue:@"as"];

когда я получаю доступ к значению токена в некоторых других классах, я получаю нулевое значение. Может ли кто-нибудь указать мне, какую ошибку я делаю? Правильно ли я использую свойство @?


person Dinesh Kumar    schedule 09.11.2013    source источник
comment
как вы получаете доступ к свойству tokenvalue в другом классе, покажите его код.   -  person Tirth    schedule 09.11.2013
comment
TokenClass *token = [[TokenClass alloc]init]; NSLog(@token здесь %@,token.tokenValue);   -  person Dinesh Kumar    schedule 09.11.2013
comment
Это разные экземпляры. Создайте некоторый общий экземпляр TokenClass, чтобы получить его из любого класса.   -  person Neil Galiaskarov    schedule 09.11.2013
comment
Вам также нужно учиться из более современного учебника. Современный Objective-C исключает необходимость явного объявления свойства ivar и строки @synthesize.   -  person rmaddy    schedule 09.11.2013
comment
Нил, можешь опубликовать ссылку или код, чтобы сделать то же самое.   -  person Dinesh Kumar    schedule 09.11.2013


Ответы (2)


Вам нужно использовать класс Singleton для предоставления переменных или объектов всему проекту или создания глобальных переменных. Создайте SharedInstance класса TokenClass и создайте свойство, к которому можно получить доступ в любом месте.

в вашем .h файле

//token class header file
@interface TokenClass : NSObject

@property (nonatomic,strong) NSString *tokenValue;

//create static method 
+ (id)sharedInstance;

в .m файле

#import "TokenClass.h"

@implementation TokenClass


#pragma mark Singleton Methods

+ (id)sharedInstance {
    static TokenClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

- (id)init {
  if (self = [super init]) {
      tokenValue = [[NSString alloc] init];
  }
  return self;
}

@end

теперь в вашем приложенииDelegate

#import TokenClass.h

@implementation AppDelegate

in `didFinishLaunchingWithOptions:`

 [TokenClass sharedInstance] setTokenValue:@"as"];

в любом классе вы можете получить значение, используя

NSLog(@"tokenValue = %@", [[SingletonClass sharedInstance] tokenValue]);
person Suhit Patil    schedule 09.11.2013

Есть много способов добиться желаемого:

1. Обычно я использую NSUserDefaults для сохранения небольшого объема данных, которые мне понадобятся, даже если пользователь закрыл приложение. Информации о том, как им пользоваться, много. См. мой ответ здесь.

2. В вашем классе UIViewController (например, в вашем rootViewController) создайте @property, который будет содержать ваш TokenClass. Тогда вы получите tokenValue на self.tokenClass.tokenValue

3. Другим способом является создание одноэлементного класса, который будет доступен в течение всего цикла выполнения вашего приложения. Кандидат-одиночка должен соответствовать трем требованиям:

  1. контролирует одновременный доступ к общему ресурсу.
  2. доступ к ресурсу будет запрошен из нескольких разрозненных частей системы.
  3. может быть только один объект.

    +(TokenClass*) sharedTokenClass {

    static dispatch_once_t pred;
    static TokenClass *_sharedTokenClass = nil;
    
    
        dispatch_once(&pred, ^{
            _sharedTokenClass = [[TokenClass alloc] init];
        });
        return _sharedTokenClass;
    }
    

    Вы будете использовать его из любого места, где захотите [TokenClass sharedTokenClass]tokenValue];

На вашем месте я бы использовал первый вариант.

PS. Я настоятельно рекомендую вам прочитать несколько статей по управлению памятью, чтобы получить представление о жизненном цикле объекта.

person Neil Galiaskarov    schedule 09.11.2013