@implementation、vars 和 ARC

@implementation, vars and ARC

在我的项目中有一个带有下一个代码的控制器 A:

@implementation NKAddPostViewController
int _characterCounter = 512;
...

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

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

这里是transfer的实现,所以没有保留controllerA:

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

2 个问题:

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

在您的评论中,您说“3) 在实现中像 ivar 一样实现并立即赋值。第三种方式更简单、更快”

第三种方式是错误的。 "ivar in implementation" 实际上是一个私有静态变量,并没有做你想要的。

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

在您的 .m 文件中,添加:

@interface NKAddPostViewController()
{
  int _characterCounter;
}

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

那应该做你想要的。

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

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

@implementation NKAddPostViewController
{
    int _characterCounter;
}

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