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