@implementation、vars 和 ARC
@implementation, vars and ARC
在我的项目中有一个带有下一个代码的控制器 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 个问题:
- 那么为什么_characterCounter保留?
- 为什么控制器初始化线路时
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:
.
在我的项目中有一个带有下一个代码的控制器 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 个问题:
- 那么为什么_characterCounter保留?
- 为什么控制器初始化线路时
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:
.