为什么init方法将此ivar设置为(null)?

时间:2011-10-25 18:30:48

标签: objective-c cocoa-touch instance-variables init

我不明白为什么在将某些数据传递给此控制器时,将init方法添加到我的视图控制器会将某些ivars设置为(null)。这是我用来设置一些ivar值并调用相关视图控制器的代码:

MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];

MyViewController中,search_type ivar按预期包含存储在上一个视图控制器中的@"buy"字符串。但是,当我在下面添加init方法时,search_type(null)尝试使用MyViewController时始终包含(id)init { self = [super init]; if(self) { // some other code here } return self; } 字符串:

@property (nonatomic,retain) NSMutableString *search_type;

search_type在接口中声明为:

@synthesize search_type;

并在实现文件中合成:

{{1}}

3 个答案:

答案 0 :(得分:1)

目前还不完全清楚你要做的是什么,但是如果你说search_type你的init方法// some other code here是{0}},那就是因为你的视图控制器在设置该属性之前初始化。

如果在运行更多代码之前需要将该对象提供给视图控制器,则有几个选项:

  • 创建自定义初始化工具,例如initWithSearchType:
  • 为该属性创建自定义setter。
  • 执行viewDidLoadviewWillAppear或类似方法中的代码。

其中哪一项是恰当的,取决于你正在做什么。

答案 1 :(得分:0)

search_type是可变的,你在MyViewController的init方法中初始化吗?

答案 2 :(得分:0)

您没有访问此代码中的实例变量

MyViewController *vc = [[MyViewController alloc] init];
MyViewController.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];

您创建名为vc但未使用它的实例。试试这个:

MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];

HTH。

<强>更新

很难说出你共享的代码中存在什么问题。我基于你所分享的内容的另一个猜测是确保你定义了你的属性并正确地合成它。

// in the header file
@property(nonatomic, copy) NSMutableString *search_type;

// in your implementation
@synthesize search_type = m_search_type;

如果你已经这样做了,你应该分享更多的MyViewController来源。无论您是否在init方法中初始化变量都无关紧要,因为无论如何您在实例化它之后都会为其赋值。