首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@implementation、vars和ARC

@implementation、vars和ARC
EN

Stack Overflow用户
提问于 2016-04-28 10:58:53
回答 2查看 68关注 0票数 0

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

代码语言:javascript
运行
复制
@implementation NKAddPostViewController
int _characterCounter = 512;
...

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

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

以下是传输的实现,所以没有任何东西保留controllerA:

代码语言:javascript
运行
复制
NKAddPostViewController *aContr = [NKAddPostViewController new];
[self.navigationController aContr animated:YES];

2个问题:

  1. ,那么为什么_characterCounter保留?
  2. 为什么当控制器初始化行int _characterCounter = 512; 不将512分配给_characterCounter?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 11:25:32

在你的评论中,你说“在实现中像伊瓦尔一样实现,并立即分配价值。第三种方式更容易、更快”。

第三条路错了。"ivar in implementation“实际上是一个私有静态变量,不执行您想要的操作。

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

在.m文件中添加以下内容:

代码语言:javascript
运行
复制
@interface NKAddPostViewController()
{
  int _characterCounter;
}

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

做你想做的事。

票数 0
EN

Stack Overflow用户

发布于 2016-04-28 11:43:26

您所做的就是声明一个全局变量。它与全班没有任何关系,而且与它毫无关系。当应用程序加载时(实际上在构建时),分配512的值只发生一次。因为它是全局的,所以您设置的任何值都会一直保持到您再次更改它为止。

如果您想要一个与类相关联的实例变量,请这样声明它.

代码语言:javascript
运行
复制
@implementation NKAddPostViewController
{
    int _characterCounter;
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36912666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档