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

时间:2014-01-28 15:31:38

标签: objective-c variables public

请记住,我不熟悉客观的c编码,也不了解很多概念。

我有两个必须互相交流的课程。 Class1声明一个字符串变量,Class2读取它。我不确定最好的方法,但经过一些研究后,我有了。

错误是当我访问Class2中的变量时,变量是(null)。

Class1.h

static NSString *var;
@interface Class1 : UIViewController {

    //other variables
}

@property(nonatomic, retain) NSString *var;
@end

Class1.m

@implementation Class1
@synthesize var;

-(void)buttonAction:(UIButton*)sender;
{
    var = @"some generated variable";
    //after setting the variable I immediately call Class2
}

Class2.h

@interface Class2 : UIViewController {
    NSString *var2;
}
@end

Class2.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)
}

我只是不确定我哪里出错了。如果我的代码不清楚,请告诉我。

1 个答案:

答案 0 :(得分:1)

问题是您没有在此类的init方法中在var中设置属性Class1的值。只有在button action方法执行时,才能执行int。因此,当您在Class1中的initWithNibName:bundle:方法中创建Class2的新实例并访问它(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;
}

为了解决这个问题,你可以在init方法的var初始化Class1,或者在运行buttonAction的同一实例中引用它来设置给Class2的var值。例如,将Class1实例作为Class2 init方法的输入传递:

这是您在 Class1.m 中从Class2方法创建和初始化buttonAction实例的方法:

-(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];
}

这将是 Class2.m 中的Class2初始化方法:

- (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;
}