@implementation, vars and ARC



在我的项目中有一个控制器a,下一个代码是:

@implementation NKAddPostViewController
int _characterCounter = 512;
...

我在代码中更改了这个变量,它的值是400。比我做popViewControllerAnimated

但当我再次转到这个控制器时,值仍然是400。在viewWillAppearviewDidLoad中,它仍然是400为什么似乎保留了控制器A,但当我在viewDidLoad中调试属性时,它们是nill,直到它们再次初始化。

这是转移的实现,所以没有什么可以保留控制器A:

NKAddPostViewController *aContr = [NKAddPostViewController new];
[self.navigationController aContr animated:YES];

2个问题:

  1. 为什么保留_characterCounter
  2. 为什么控制器初始化线路int _characterCounter = 512;不将512分配给_characterCounter

您所做的是声明一个全局变量。它根本不与类绑定,也与类完全无关。当应用程序加载时(实际上是在构建时),会分配512的值,并且只"发生"一次。因为它是全局的,所以您设置的任何值都将保留,直到您再次更改它为止。

如果您想要一个绑定到类的实例变量,请这样声明它。。。

@implementation NKAddPostViewController
{
    int _characterCounter;
}

请注意,不能使用声明初始化变量。使用init覆盖或viewDidLoad:

在你的评论中,你说"3)在实现中像ivar一样实现,并立即赋值。第三种方法更容易、更快"

第三种方式是错误的。"ivar in implementation"实际上是一个私有的静态变量,并不能随心所欲。

您可以创建一个私有类别并在那里定义一个新的实例变量:

在.m文件中,添加以下内容:

@interface NKAddPostViewController()
{
  int _characterCounter;
}
- (instancetype) init;
{
  self = [super init]; 
  if (!self) 
    return nil;
  _characterCounter  = 512;
}

这应该是你想要的。

最新更新