@implementation,vars和ARC

时间:2016-04-28 10:58:54

标签: ios objective-c automatic-ref-counting

在我的项目中有一个带有下一个代码的控制器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?

2 个答案:

答案 0 :(得分:1)

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

如果你想要一个与该类绑定的实例变量,请将其声明为......

@implementation NKAddPostViewController
{
    int _characterCounter;
}

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

答案 1 :(得分:0)

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

第三种方式是错误的。 “实现中的ivar”实际上是一个私有静态变量,并不能做你想要的。

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

在.m文件中,添加:

@interface NKAddPostViewController()
{
  int _characterCounter;
}

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

那应该做你想要的。