请记住,我不熟悉客观的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)
}
我只是不确定我哪里出错了。如果我的代码不清楚,请告诉我。
答案 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;
}