问题标签 [ivar]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
3221 浏览

objective-c - 我应该在 Objective-C 中使用 ivars 吗?

我正在编写一个仅使用@properties 的应用程序。我的任何类文件中都没有声明一个 ivar。据我了解,随着@property 的引入,不再需要 ivars。我是否根据最佳实践进行编码?从长远来看,这最终会在众所周知的屁股上咬我吗?我一直在阅读关于什么是“正确”和“错误”的混合评论......

0 投票
7 回答
35309 浏览

objective-c - 为什么要使用 ivar?

我通常看到这个问题以另一种方式提出,例如Must every ivar be a property? (我喜欢 bbum 对这个 Q 的回答)。

我几乎只在我的代码中使用属性。然而,每隔一段时间,我就会与一个长期在 iOS 上进行开发并且是传统游戏程序员的承包商一起工作。他编写的代码几乎不声明任何属性,并且依赖于 ivars。我认为他这样做是因为 1.) 他已经习惯了它,因为直到 Objective C 2.0(07 年 10 月)和 2.) 属性并不总是存在,因为不通过 getter/setter 的性能增益最小。

虽然他编写的代码不会泄漏,但我仍然希望他使用属性而不是 ivars。我们谈到了它,他或多或少认为没有理由使用属性,因为我们没有使用 KVO,而且他在处理内存问题方面经验丰富。

我的问题更多......你为什么要使用 ivar 时期 - 是否有经验。使用 ivar 是否真的有那么大的性能差异是合理的?

另外作为澄清点,我根据需要覆盖了 setter 和 getter,并在 getter/setter 中使用与该属性相关的 ivar。但是,在 getter / setter 或 init 之外,我总是使用self.myProperty语法。


编辑 1

我很欣赏所有好的回应。我想解决的一个似乎不正确的问题是,使用 ivar,您可以在使用属性的情况下获得封装。只需在类延续中定义属性。这将向外界隐藏财产。您还可以在接口中声明属性 readonly 并在实现中将其重新定义为 readwrite ,例如:

并在课堂上继续:

要让它完全“私有”,只需在类延续中声明它。

0 投票
1 回答
164 浏览

uiviewcontroller - 实例变量与否... dealloc 的问题

因此,在我的 ARC 项目中,每当我使用实例变量分配 ViewController 时,在解除或弹出控制器时似乎永远不会调用 dealloc。

在我的标题中:

...

...

然后在我的代码中:

现在,在 composeView 中,我已将所有委托设置为 nil,但从未调用 dealloc,随后,在重新加载视图控制器时不会再次调用 viewDidLoad。

如果我不使用实例变量,而直接创建它,一切都很好。任何帮助表示赞赏,谢谢!

0 投票
1 回答
1291 浏览

rspec - 是否可以在非控制器测试中存根 rspec 中的实例变量?

我通常会在我的控制器中设置一个实例变量,但我正在单元测试一个模型方法,该方法取决于控制器中设置的实例变量的值。

使用 rspec,是否可以为测试存根或设置此实例变量?

到目前为止,我所看到的一切都表明我只能从控制器或视图测试中存根/设置实例变量,而不是模型测试。

0 投票
2 回答
705 浏览

objective-c - 为了提高效率,可以接受从课堂外直接访问 ivar 吗?

我可以定义一个具有属性的类,以从类外部访问我的 ivars。

我也可以只使用 myInst->ivar 语法以 C-struct 方式访问。

在 C++ 中,我会使用访问器,但在 Objective-c 中,在某些情况下我可能需要直接访问。消息传递系统对在某些上下文中很重要的访问器造成很大的性能损失,因为消息不像 C++ 方法那样内联。

例如,在一个类中,它有一个名为 scalar 的 ivar 和一个在其上定义的属性。标量是一个简单的浮点值:

如果我将 [myinst scalar] 更改为 myinst->scalar,该方法将运行得更快,因为在此循环中使用访问器调用会占用大部分 CPU。

与 C++ 一样,我理解通常不鼓励直接访问 ivar,但在这种情况下,当速度很重要时,它可以接受吗?如果没有,是否有更首选的方法仍然使用objective-c 类?

0 投票
2 回答
489 浏览

objective-c - 在 Objective c 中暴露/合成 iVar 属性

我有一个类,它基本上充当另一个类的轻量级包装类。它将其他类作为 iVar。我希望能够公开 iVar 的某些属性(实际上是很多),但要这样做,我必须像这样写出每个属性访问器:

当然,我必须对每一个属性都这样做,这很痛苦(大约有 30 个)。我希望能够合成它,但我无法弄清楚如何合成。

可以合成吗?

另外,我不能子类化....好吧,我也许可以,但真的不推荐。iVar 类真的很重(它实现了 CoreText)。我宁愿手工写出方法。

0 投票
2 回答
107 浏览

objective-c - 为所有 iVar 创建属性是否有必要,甚至是良好做法?

如果要在类中全局使用 ivar,但永远不会被其他类访问,我们还应该使用属性吗?

0 投票
1 回答
70 浏览

objective-c - cocos2d 类和 ivars

当实例变量(或 ivars)是类名时,我对它们的意义感到非常不安。我知道这是一个基本的 Objective-C 原则,但我想在使用 cocos2d 时给它一些相关性。

例如在这个界面中:

CCSpriteSheet 类(现在更新为 CCSpriteBatchNode,但这是引擎的较旧 v)有一个实例,它是 BulletCache 的实例变量。

但这究竟意味着什么?它允许 BulletCache 做以前做不到的事情?

0 投票
1 回答
60 浏览

objective-c - ivars 的行为不符合预期

我最近阅读了一篇关于不再需要在 ViewControllers 上声明 ivars 和属性的帖子,并且在我注意到它们时一直在从我的代码中删除重复的声明。

我注意到的一个非常令人费解的效果是,如果属性缺少声明的 ivar,则需要在其前面加上self.Eg:

自定义VC.h:

自定义VC.m:

如果在没有 的情况下访问变量时出现问题self.,我预计会出现编译时或运行时错误,但它似乎只是默默地失败,使得调试变得困难。

0 投票
1 回答
85 浏览

cocoa - 如何避免在 Mac 应用程序版本中明确声明 ivars?

我知道从 iOS 4.0 开始没有必要明确声明 ivars。我只是使用@synthesize myVar = _myVar;这很适合我,因为它打字少,虽然我真的不知道为什么或来自哪个设置。我试图在我的 Mac 应用程序中做同样的事情。它在调试模式下构建时工作,但是,一旦我切换到制作存档,编译器就开始抱怨。有没有办法抑制这种情况?