Objective c 访问另一个类目标c中的字符串变量
请记住,我对objective c编码是新手,不了解其中的许多概念 我有两个班级必须互相交谈。Class1声明一个字符串变量,Class2读取它。我不确定做这件事的最佳方式,但经过一些研究后,这里是我所拥有的 错误在于,当我访问Class2中的变量时,该变量为(null) 类别1.hObjective c 访问另一个类目标c中的字符串变量,objective-c,variables,public,Objective C,Variables,Public,请记住,我对objective c编码是新手,不了解其中的许多概念 我有两个班级必须互相交谈。Class1声明一个字符串变量,Class2读取它。我不确定做这件事的最佳方式,但经过一些研究后,这里是我所拥有的 错误在于,当我访问Class2中的变量时,该变量为(null) 类别1.h static NSString *var; @interface Class1 : UIViewController { //other variables } @property(nonatomic,
static NSString *var;
@interface Class1 : UIViewController {
//other variables
}
@property(nonatomic, retain) NSString *var;
@end
1.m班
@implementation Class1
@synthesize var;
-(void)buttonAction:(UIButton*)sender;
{
var = @"some generated variable";
//after setting the variable I immediately call Class2
}
类别2.h
@interface Class2 : UIViewController {
NSString *var2;
}
@end
类别2.m
#import "Class1.h"
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
Class1 *obj = [[Class1 alloc] init];
var2 = obj.var;
NSLog(@"%@", var2);
//this print statement is (null)
}
我只是不确定我会错在哪里。如果我的代码不清楚,请告诉我。问题是您没有在类的init方法中设置
Class1
中的属性var
的值。仅当执行按钮操作
方法时才执行int。因此,当您在Class2
中的initWithNibName:bundle:
方法中创建Class1
的新实例并访问它(var2=obj.var;
)时,该实例的var
属性尚未设置,因此它具有默认的nil
值
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
Class1 *obj = [[Class1 alloc] init];
var2 = obj.var; // <-- obj.var is not set, so it returns nil
NSLog(@"%@", var2);
//this print statement is (null)
}
return self;
}
这将是Class2.m中的Class2
init方法:
-(void)buttonAction:(UIButton*)sender;
{
self.var = @"some generated variable";
//after setting the variable I immediately call Class2
Class2 *obj2 = [Class2 alloc] initWithNibName:@"yourNibName"
bundle:nil
andClass1:self];
}
- (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil
andClass1:(Class1 *)obj
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
var2 = obj.var; // <-- obj.var will be set in buttonAction
NSLog(@"%@", var2);
}
return self;
}
-(id)initWithNibName:(NSString*)nibNameOrNil
bundle:(NSBundle*)nibBundleOrNil
andClass1:(Class1*)obj
{
self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
如果(自我){
var2=obj.var;//您正在创建Class1
的新实例,您没有引用保存变量的实例。您需要传递Class1
的实例,在该实例中您已将变量设置为Class2
问题不是为什么它是nil
,尽管它是,但特别是为什么它是nil
s不是@“某个生成的变量”;
。这是因为创建了一个新实例,而该实例没有保存另一个实例中设置的值。是的。此解释有效。感谢您的清晰解释,因为它非常有用。编辑@rckoenes非常好。我忘了遵循标准的init方法结构,并调用super的initWithNibName
方法D