【问题标题】:Access a string variable in another class objective c访问另一个类目标 c 中的字符串变量
【发布时间】:2014-02-20 00:03:37
【问题描述】:

请记住,我是 Objective C 编码的新手,很多概念都不懂。

我有 2 节课必须互相交流。 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)
}

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

【问题讨论】:

  • 您正在创建Class1 的新实例,您没有引用保存该变量的实例。您将需要传递 Class1 的实例,您已将变量设置为 Class2

标签: objective-c variables public


【解决方案1】:

问题是你没有在这个类的init方法中设置Class1中属性var的值。仅在执行 button action 方法时才执行 int 。因此,当您在Class2initWithNibName: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;
}

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

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

-(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 init 方法:

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

【讨论】:

  • 问题不是关于为什么它是nil,虽然它是,但尤其是为什么它不是@"some generated variable";。这是因为创建了一个新实例,它没有保存在另一个实例中设置的值。
  • 是的。这个解释奏效了。感谢您的清晰解释,因为它非常有帮助。
  • 精彩的编辑@rckoenes。我忘了遵循标准的init方法结构并调用super的initWithNibName方法。
猜你喜欢
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多