- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直无法找到关于这个主题的任何信息,而且我对它的大部分了解完全是偶然的(并且花了几个小时试图弄清楚为什么我的代码不起作用)。在学习 objective-c 的大多数教程中,我发现 make 变量和属性具有相同的名称。我不明白其中的重要性,因为似乎该属性完成了所有工作,而变量就在那里。例如:
测试.h
@interface Test : NSObject {
int _timesPlayed, _highscore;
}
@property int timesPlayed, highscore;
// Methods and stuff
@end
测试.m
@implementation Test
@synthesize timesPlayed = _timesPlayed;
@synthesize highscore = _highscore;
// methods and stuff
@end
我所知道的
1) 好的,所以今天我发现(经过几个小时的困惑)无论你对属性 highscore = 5091231
做了多少改变,当你尝试调用 [ test highscore] 因为它仍然会返回 _highscore 的值,我认为它是在 test.h 中设置的 ivar。因此,test.m 中所有变量的更改都需要更改 _highscore 而不是 highscore。 (如果我在这里错了请纠正我)
2) 如果我理解正确(我可能没有理解),test.h 中设置的 ivars 代表实际内存,而 @properties 只是访问该内存的方法。因此,在实现之外,我无法在不通过属性的情况下访问 _highscore。
我不明白的地方
基本上,对于这种情况,我不明白我是否需要使用 ivar,或者我是否可以只使用 @property 和 @synthesize。似乎 ivars 只是额外的代码,除了让我感到困惑之外什么也没做。我见过的一些最新的 tuts 似乎没有使用 ivars,但有些却使用了。那么这只是编码偏好问题还是真的很重要?我曾尝试搜索 Apple 的文档,但我在那里迷路了,似乎从来没有找到我要找的东西。任何指导将不胜感激。
最佳答案
您可以将合成属性的语法视为@synthesize propertyName = variableName
。
这意味着如果您编写 @synthesize highscore = _highscore;
,将为您创建一个名为 _highscore
的新 ivar。因此,如果您愿意,可以通过转到 _highscore
变量直接访问存储该属性的变量。
在某些我不记得的编译器版本之前,综合语句不会创建 ivar。相反,它只说明了它应该使用什么变量,所以你必须同时声明变量和属性。如果您使用下划线前缀进行合成,那么您的变量需要具有相同的前缀。现在您不必再自己创建变量,而是将创建一个具有您在综合语句中指定的 variableName
的变量(如果您尚未自己声明它,在这种情况下它仅用作属性的支持变量)。
您在声明变量时显式创建一个名为 highscore
的 ivar,然后在合成属性时隐式创建另一个名为 _highscore
的 ivar。它们不是同一个变量,因此更改其中一个不会改变另一个。
这真的是一个关于偏好的问题。
有些人觉得,如果您不必到处写 self.
,代码会变得更干净。人们还说它更快,因为它不需要方法调用(尽管它可能永远不会对您的应用程序性能产生可衡量的影响)。
更改属性的值将调用所有必要的 KVO 方法,以便其他类可以在值更改时得到通知。默认情况下对属性的访问也是原子的(不能从一个以上的线程访问)所以从多个线程读取和写入属性更安全(这并不意味着属性指向的对象是线程安全的,如果它是一个可变数组,那么多线程仍然会破坏事情,这只会阻止两个线程将属性设置为不同的东西。
关于objective-c - 在 objective-c 中使用 ivars 与属性的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478038/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!