Objective-c, как получить доступ к переменной экземпляра из другого класса
Я привык программировать на Java и использовать переменные класса для доступа к данным из других классов. Затем я обнаружил, что переменные класса не работают так же, как в Obj-C, и имеют проблемы с этим.
Моя проблема в том, что я хочу получить доступ к введенному пользователем паролю в другом классе после того, как пользователь вошел в систему. Читал на разных форумах и поэтому я должен использовать методы класса (+) для доступа к этим данным. Но поскольку мне нужно создать новый экземпляр первого класса во втором классе, это означает, что введенный пароль не существует в новом экземпляре первого класса.
Мой код выглядит следующим образом:
Class1.h
@interface class1 : UIViewController {
UITextField *usernameField;
UITextField *passwordField;
UIButton *loginButton;
NSString *password;
}
@property (nonatomic, retain) IBOutlet UITextField *usernameField;
@property (nonatomic, retain) IBOutlet UITextField *passwordField;
@property (nonatomic, retain) IBOutlet UIButton *loginButton;
@property (nonatomic, retain) NSString *password;
-(IBAction) loginButtonPushed;
+(NSString *)password;
@end
class1.m
#import "viewSwitcherViewController.h"
@implementation viewSwitcherViewController
@synthesize usernameField;
@synthesize passwordField;
@synthesize loginButton;
@synthesize password; // not needed
-(IBAction) loginButtonPushed {
password = passwordField.text; //not needed
// ...Code for switching view if successful login... EDITED:
class2 *c2 = [class2 alloc] init]; //Instantiating new class2 object
c2.password = passwordField.text; //Assigning tekst from passworField to thePassword-variable in the class2 instance.
}
class2.m
#import "class2.h"
#import "class1.h"
@implementation class2
@synthesize thePassword; //NSString variable
// this method is also not needed
-(void) someMethodUsingPassword {
class1 *c1 = [[class1 alloc] init];
thePassword = [c1 password];
NSLog(@"The password is: %@", thePassword); //This call returns null
}
Поэтому моя проблема заключается в том, что экземпляр c1, созданный в class2, не содержит предоставленный пароль и, следовательно, возвращает "ноль".
Возможно, это просто мой подход к Java, но я не смог найти другого пути, поэтому, пожалуйста, помогите:)!
4 ответа
Переменная общего класса в Java эквивалентна глобальной переменной в C и Objective-C. Вы бы реализовали это как:
Class1.h
extern NSString* MyGlobalPassword;
class1.m
NSString* MyGlobalPassword = nil;
Затем любой, кто импортирует class1.h, может читать и писать в MyGlobalPassword
,
Несколько лучший подход - сделать его доступным через "метод класса".
Class1.h:
@interface Class1 : UIViewController {
UITextField *usernameField;
UITextField *passwordField;
UIButton *loginButton;
}
+ (NSString*)password;
@end
class1.m:
static NSString* myStaticPassword = nil;
@implementation Class1
+ (NSString*)password {
return myStaticPassword;
}
- (void)didClickLoginButton:(id)sender {
[myStaticPassword release];
myStaticPassword = [passwordField.text retain];
}
Другие классы будут затем читать пароль через password
метод класса.
Class2.m:
-(void) someMethodUsingPassword {
thePassword = [Class1 password]; // This is how to call a Class Method in Objective C
NSLog(@"The password is: %@", thePassword);
}
Вы должны переосмыслить, как настроена структура вашего приложения. Ваша основная потребность в том, чтобы сохранить пароль в одном классе и получить доступ к нему в другом, верно? NSUserDefaults
идеально подходит (почти идеально, см. примечание № 3 ниже) для этого. Измени свой class1
код, чтобы выглядеть так:
-(IBAction) loginButtonPushed {
NSString *username = self.usernameField.text;
NSString *password = self.passwordField.text;
// Do your login stuff here, if successful do the following
NSUserDefaults *defaults = [NSUserDefaults standardUserDefauls];
[defaults setObject:username forKey:@"usernameKey"];
[defaults setObject:password forKey:@"passwordKey"];
}
Избавьтесь от своего свойства пароля, теперь оно вам ни к чему. Кроме того, избавиться от вашего +(NSString *)password;
метод класса.
Когда вам нужно получить доступ к логину и паролю:
-(void) someMethodUsingPassword {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefauls];
NSString *username = [defaults stringForKey:@"usernameKey"];
NSString *password = [defaults stringForKey:@"passwordKey"];
// do whatever here
}
Несколько заметок
- Я написал это по памяти, поэтому у них могут быть ошибки, если вы их обнаружите, дайте мне знать, и я обновлю свой ответ.
- Вы, кажется, упускаете несколько ключевых моментов о том, как использовать методы и свойства класса. Я настоятельно рекомендую прочитать Введение Apple в Objective-C.
- Хранение логина и пароля в
NSUserDefaults
не безопасно. Если кто-то получит root-доступ к вашему устройству или к резервным копиям вашего устройства, он может извлечь эту информацию для входа. Если безопасность важна для вас, сохраните информацию для входа в связку ключей.
class1
создано в class2
не будет установлен пароль, потому что вы только что создали новый экземпляр с [[class1 alloc] init]
- это не будет делить переменные-члены с другими экземплярами class1
создано в другом месте.
В общем-то,
Когда вы принимаете пароль на одном экране и делаете что-то с ним, у вас все еще есть. Когда вы переходите к другому экрану, почему вы не сохраняете объект класса 1 как свойство в классе 2 и устанавливайте его до того, как вы передадите управление классу 2.
Или, если вы просто вызываете метод class2, просто передайте class1 obj в качестве параметра с уже введенным паролем.
и в случае, если вы просто передадите его методу в качестве параметра, вы сможете получить к нему доступ. Или, если вы устанавливаете его как свойство этого класса2. тогда вы всегда можете использовать геттер.
Эта вещь не имеет ничего общего с Java или Objective C.