Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 访问另一个类目标c中的字符串变量_Objective C_Variables_Public - Fatal编程技术网

Objective c 访问另一个类目标c中的字符串变量

Objective 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,

请记住,我对objective c编码是新手,不了解其中的许多概念

我有两个班级必须互相交谈。Class1声明一个字符串变量,Class2读取它。我不确定做这件事的最佳方式,但经过一些研究后,这里是我所拥有的

错误在于,当我访问Class2中的变量时,该变量为(null)

类别1.h

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