问题标签 [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.
iphone - 如何在 theos/logos 中创建自定义属性?
是否可以使用 theos/logos 在挂钩方法中创建自定义属性?
例子:
我已经按照上面的示例进行了尝试,但没有成功。
ios - 在没有 iVar 的情况下将数据传递到 segue 目的地
由于切换到情节提要,我通过加载视图控制器
这完美地工作。现在,如果我想在目标视图控制器上设置任何属性,我会实现该方法prepareForSegue:sender:
并设置我需要设置的属性。一切都按预期工作,没有任何问题。
自从我开始使用这种方法而不是旧的
我觉得将参数传递给目标视图控制器有点笨拙,特别是如果您尝试设置的值不仅仅是一个静态值。
例如,我有一个从服务器获取一些数据的按钮。当数据返回时,它会创建一个新对象,然后呈现一个新的视图控制器来显示这个对象。为此,我调用performSegueWithIdentifier:sender:
,但这就是它的结束。我的对象现在被释放并且不再存在,我无法将它传递给prepareForSegue:sender:
方法,除非我将它存储在实例变量中。
这感觉非常可怕,因为该对象的持续时间不超过此操作,并且与我当前视图控制器中的任何其他内容无关。
在这种情况下,我知道我可以很简单地请求新视图控制器中的数据,但这只是一个示例。
我的问题是,是否有另一种方法可以做到这一点而不会让人感觉如此 hacky?我可以将这些数据放入目标视图控制器而不将其存储在实例变量中吗?
我知道我仍然可以使用旧方法,但如果可以的话,我想坚持使用情节提要方法。
ios - ios - ivar 在块内为空,尽管在块执行之前设置
我有以下代码:
问题是,它self.userData
在#1 中正确设置(并且不为空),但是当我到达#2 时 -self.userData
变为空...... Point #1 是我设置的唯一位置self.userData
。
ios - 苹果代码示例,为什么他们在这里直接访问 ivars?
查看 MultipeerGroupChat 的 Apple 示例应用程序(特别是 MainViewController.m):
该示例包含以下代码分配属性:
然后在 viewDidLoad 中初始化它们:
他们是否有理由直接分配给 ivars _transcripts 和 _imageNameIndex?我认为正确的约定要求您始终使用属性来访问变量,除非您在 init 方法中......事实上,在 viewDidLoad 方法中,作者确实使用属性来分配其他变量:
我知道 Apple 示例代码过去有时会偏离良好的编码实践,所以我想知道这是否只是草率的编码,或者是否有正当理由直接以非初始化方法访问这两个 ivars。
ios - 将 BOOL 声明为 iVar 或 Property 的最佳途径
我已经阅读了一些关于 iVar 和 Properties 之间差异的问题,例如:为什么要使用 ivar?
ios 接口 iVar vs 属性
我想知道的是......如果我正在创建一个需要以多种方法访问的 BOOL UIViewController
(例如),那么创建这些的最佳方法是什么?
目前我创建属性。这可以正常工作并且符合预期。但是当我阅读/了解更多时,似乎创建 iVar 会更好地提高性能。
喜欢:
这对性能会更好吗,如果我将一个值设置为 YES,多个方法可以访问这个 iVar,我可以检查另一个值吗 - 就像我可以使用属性方法一样?
ios - 访问依赖于异步内容的类属性
我想实现的目标:我想在视图中显示用户地址。视图由视图控制器处理。此 VC 正在使用 GeoAPI 来访问用户位置。GeoAPI 包裹在 LocationManager-Class 周围,后者又负责处理所有 locationmanager 的东西。在这个位置管理器类中,我想如上所述反向地理编码。
geoAPI 有一些方便的方法可以用来获取我想要的信息。
地理API:
现在..由于反向地理编码功能的异步字符的事实,我不确定何时可以使用带有用户地址的字典。
位置管理器类包含以下内容:
位置经理:
在视图控制器中,我想访问我通过 API 传递的 userLocation 信息字典
视图控制器
但是 userlocationInfoDict 是空的。我想这是因为我的函数调用“startFetchingCurrentUserLocationInformation”在异步块返回我需要的值之前返回。然后我想通过 NSNotificationCenter 处理这个问题,我会在数据可用时收到通知。但现在我被困住了:
我需要做什么才能访问 GeoAPI 传递的 userLocationInformation 以便在数据到达时及时执行此操作?
任何帮助表示赞赏!谢谢塞巴斯蒂安
objective-c - ARC:属性与 ivar:复制,弱
通过阅读ARC 时代的 Property vs. ivar,我了解到__strong
当我直接获取或设置strong
属性的自动合成关联实例变量但既不会调用自定义 getter 或 setter 也不会触发 KVO 时,ARC 将使用所有权限定符。
但是,如果我这样声明一个属性weak
:
自动合成的关联实例变量会采用
__weak
所有权限定符吗?例如,将
_delegate = delegate
(vsself.delegate = delegate
) 在我的实现中根据
__weak
资格执行任务?对于用 声明的属性
copy
呢?
objective-c - 初始化哪个,属性或其实例变量
假设我在我的类中有一个名为myPropertyName
defined的属性MyClassName
。这篇文章中使用了手动内存管理。
我的类名.h
我的类名.m
我对myPropertyName
声明的位置,实例变量之间的区别等用法感到困惑。比如这三个初始化代码语句有什么区别,比如-(void)init
我的类的自定义方法myClassName
。
self.myPropertyName = [[[NSObject alloc] init] autorelease];
这个正在调用
myPropertyName
setter,但我不确定 setter 中使用的实例变量的名称是什么,myPropertyName
(因为我已经声明了一个名为 @private 的字段myPropertyName
)或_myPropertyName
(人们说这个带有下划线的是默认值)?myPropertyName = [[NSObject alloc] init];
myPropertyName
这会初始化属性的实例变量吗?如果我没有@synthesize myPropertyName = _myPropertyName;
,那会不会是错误的,因为据说该属性的默认实例变量是_myPropertyName
._myPropertyName = [[NSObject alloc] init];
即使我使用and仍被
_myPropertyName
声明为我的属性的实例变量?myPropertyName
@synthesize myPropertyName;
@private NSObject* myPropertyName;
在我的理解中,属性只是一个名字(比如myPropertyName
),应该有一些实例变量被封装在代码中的实际操作中使用,比如赋值。
objective-c - Objective-C self->_ivar 访问与显式与隐式 self->
一般问题
直到现在,我一直认为self->_ivar
等于_ivar
. 今天我发现这并不完全正确。
例如,请参见以下代码片段:
即使我self
用一些NSInteger
也命名self
的东西隐藏了原件,隐含的 ivar 语法_testIVar
仍然可以找到“原始”自我,而self->_testIVar
显然没有。在后一种情况下,编译器正确地抱怨
成员引用类型“NSInteger”(又名“long”)不是指针
然而,在第一种情况下,它只是有效。
现实世界的问题
这个例子可能看起来相当人为,但它根本不是。例如,ExtObjC项目(由ReactiveCocoa使用)定义了非常方便的方法@weakify(var)
,它通过定义非常方便的语法(不再需要编写奇怪和繁琐的语法)@strongify(var)
来帮助防止在块中强捕获(和其他对象 )。例如:self
__weak typeof(self) weakSelf = self; [...] ^{ __strong typeof(self) strongSelf = weakSelf; [...] }
如果没有@weakify
and @strongify
,该块将捕获对 的强引用self
。与它@weakify
并@strongify
没有。self
因此,在块运行之前,不会推迟释放。但是,主要优点是您不需要记住使用weakSelf
orstrongSelf
代替,self
因为“原始”self
是隐藏的。
这非常方便,ExtObjC通过使用宏生成类似于以下内容的@weakify
/来实现:@strongify
很公平,这更好,因为我们可以继续使用self
而无需实际捕获对self
. 然而,只要我们使用implicit-ivars-of-self-syntax,对“原始”的强引用self
仍然会被捕获!
杂项
在块中使用 ivars 时,我们肯定会捕获self
. 例如,请参阅此屏幕截图:
。
屏幕截图的另一个有趣之处是警告消息是
未使用的变量“自我”
在下面的行中
在此块中强烈捕获“自我”可能会导致保留周期
这就是为什么我认为有两个版本的self
:-)
问题
这里的实际问题是:到底是什么_testIVar
意思?它如何找到“原始”self
指针?
澄清(另见我的屏幕截图):正如@MartinR 指出的(这也是我的想法),有一些特殊版本self
无法更改,仅用于隐式自我ivar-access。这在某处有记录吗?基本上在哪里定义了隐式self
指的是什么?它的行为似乎与例如 Java 的行为相同 (with this
),但不同之处this
在于您无法覆盖的保留关键字。
问题也不是如何“修复”它,只是写self->_testIVar
将是我在@weakify
/@strongify
示例中想要的。我认为通过使用@weakify
/@strongify
你不能再犯隐式强捕获的错误,self
但事实似乎并非如此。
ios - 通知 iVar 值更改
我想在 iVar 的值发生变化时收到通知。假设我们在不调用 setter 的情况下更改字符串的值,那么我将如何在同一个班级中了解。因为 KVO 和覆盖 setter 仅适用于调用 setter。没有 iVar。