Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 为什么init方法将这个ivar设置为(null)?_Objective C_Cocoa Touch_Instance Variables_Init - Fatal编程技术网

Objective c 为什么init方法将这个ivar设置为(null)?

Objective c 为什么init方法将这个ivar设置为(null)?,objective-c,cocoa-touch,instance-variables,init,Objective C,Cocoa Touch,Instance Variables,Init,我不明白为什么将init方法添加到我的视图控制器时,会将一些IVAR设置为(null)。下面是我用来设置一些ivar值并调用关联视图控制器的代码: MyViewController *vc = [[MyViewController alloc] init]; vc.search_type = [NSMutableString stringWithString:@"buy"]; [self.navigationController pushViewController:vc animated:NO

我不明白为什么将
init
方法添加到我的视图控制器时,会将一些IVAR设置为
(null)
。下面是我用来设置一些ivar值并调用关联视图控制器的代码:

MyViewController *vc = [[MyViewController alloc] init];
vc.search_type = [NSMutableString stringWithString:@"buy"];
[self.navigationController pushViewController:vc animated:NO];
MyViewController
中,
search\u type
ivar按预期包含存储在上一个视图控制器中的
@“buy”
字符串。但是,当我在下面添加
init
方法时,
search\u type
MyViewController
中尝试使用时总是包含
(null)
字符串:

(id)init
{
   self = [super init];
   if(self)
   {
        // some other code here
   }
   return self;
}
搜索类型在接口中声明为:

@property (nonatomic,retain) NSMutableString *search_type;
并在实施文件中综合:

@synthesize search_type;

搜索类型是可变的,您是否在MyViewController的init方法中初始化?

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

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

更新

很难说您共享的代码中有什么问题。根据您共享的内容,我的另一个猜测是确保您正确定义了属性并合成了它

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

// in your implementation
@synthesize search_type = m_search_type;

如果您已经这样做了,您可能应该分享更多的
MyViewController
源代码。无论您是否在
init
方法中初始化该变量,这都无关紧要,因为您在实例化它之后正在为它分配一个新值。

不完全清楚您要做什么,但是,如果您在
init
方法中说
search\u type
为nil,您在此处放置了
//其他一些代码,那是因为您的视图控制器在设置该属性之前已初始化

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

  • 创建自定义初始化器,例如
    initWithSearchType:
  • 为该属性创建自定义设置器
  • viewdiload
    中执行代码,
    view将出现
    或类似方法

以下哪一项是合适的取决于您正在做什么。

搜索类型是可变的,但我没有初始化它。我应该吗?是的,如果是可变的,你应该唯一改变的是现在搜索类型包含空字符串“”,而不是MyViewController的标题中的(null)。搜索类型是一个属性?我得到-1,因为我试图帮助我,我只是在输入stackoverflow时犯了一个错误…无论如何thx:)用另一个想法更新了答案。介意共享更多吗?
NS[Mutable]String
属性(或任何具有可变子类的类)通常应该声明为
(copy)
,这样您就不会共享可变对象。当我使用retain时,得到了带有“copy”的点,我要测试它,但是“m\u search\u type”在哪里在您的代码中,它只是为生成的ivar分配了一个名称。检查我试图做的只是将search\u type值传递给另一个控制器,但是当我添加init方法时,传递的值似乎在某个地方被清除,因为当我尝试使用search\u type时,它现在包含一个空字符串“”,如果我在init method中alloc/init search type或(null)如果未在尝试使用
search\u type
的地方发布代码,并发布完整的
init
method.init方法包含search\u type=[[NSMutableString alloc]init];然后在viewDidLoad中,我只生成NSLog(@“search\u type=%@”,search\u type);并打印带有空字符串的search_type=“”