在我的项目中有一个控制器a,下一个代码是:
@implementation NKAddPostViewController
int _characterCounter = 512;
...
我在代码中更改了这个变量,它的值是400。比我做popViewControllerAnimated
。
但当我再次转到这个控制器时,值仍然是400。在viewWillAppear
、viewDidLoad
中,它仍然是400为什么似乎保留了控制器A,但当我在viewDidLoad
中调试属性时,它们是nill
,直到它们再次初始化。
这是转移的实现,所以没有什么可以保留控制器A:
NKAddPostViewController *aContr = [NKAddPostViewController new];
[self.navigationController aContr animated:YES];
2个问题:
- 为什么保留_characterCounter
- 为什么控制器初始化线路
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;
}
这应该是你想要的。