iphone - iOS,使用下划线与直接使用 iVar

标签 iphone ios objective-c cocoa-touch ivar

<分区>

这个问题已经被问了很多,但这个问题是为了获取您何时使用这些方法的示例。请使用 setter 和 getter 无限循环以外的示例

例子。

.h -
@property(nonatomic, strong)NSMutableArray* mutArray
.m -
@synthesize mutArray= _mutArray;

1)我想要:
_mutArray = [[NSMutableArray alloc] init];
或者
self.mutArray=[[NSMutableArray alloc] init];
为什么我要分别做它们,它们有什么区别?!

2) 如果我想给它添加一个对象...
[_mutArray addObject:object];
或者
[self.mutArray addobject:object];

为什么?!

非常感谢!

最佳答案

您应该只在 initdealloc 中或在实现细节绝对需要的地方(例如访问器本身内部,或您实际需要的地方)处理您的 ivars内存地址)。除了那些地方,您应该始终使用访问器,这意味着 [self foo] 而不是 _foo

self.foo 只是实际调用的语法糖,即 [self foo]。重要的是要理解 self.foo 是标准的 ObjC 消息发送,与 [self foo] 的含义完全相同。按照惯例,您应该只在引用属性时使用点语法。

根据我的经验,在 ARC 之前,直接使用 ivars 是导致崩溃的第一大原因。在没有 ARC 的情况下直接分配给 ivar 时,您搞砸的可能性在程序范围内迅速接近 100%。

自 ARC 以来,我仍然认为您应该始终使用访问器(除了上面给出的异常(exception)情况),但原因更加微妙。这样做的主要原因是访问器可以在当前类、子类中或通过 KVO(完全发生在您的代码之外)进行自定义。如果你直接访问ivar,那么你将绕过它。例如,假设该属性是延迟创建的(这很常见)。然后,如果您在创建 ivar 之前使用它,就会出现细微的错误。因此,对于该属性,您必须记住始终使用访问器。同样,您可以调用 setNeedsDisplay 或发布通知等。

如果您有一个简单的规则说“我将始终使用访问器”,那么很容易查看代码并知道它是正确的。在少数情况下,您需要绕过访问器,_ 会说“嘿,注意这里,我在做一些奇怪的事情。”

如果您有一条规则“我将为需要它的属性使用访问器,而不为不需要它的属性使用访问器”,那么几乎不可能查看代码并知道它是否正确。以前的开发人员使用 ivar 是因为它是必需的还是仅仅因为他喜欢它?改不改?很难知道。

因此,即使是在 ARC 之后,始终如一地使用访问器也是很好的防御性编程,我强烈推荐它。

关于iphone - iOS,使用下划线与直接使用 iVar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15644386/

相关文章:

ios - 为什么我的场景相机在使用 SCNTechnique 时只显示黑屏?

iphone - 下载一个应用程序并安装 2 个应用程序

ios - 应用程序在后台运行时发送本地通知 Swift 2.0

iphone - 在 .m 文件中声明 Objective C 接口(interface)的实例变量(在 Release模式下)

iphone - 调用[[super allocWithZone :nil] init],消息机制

iphone - 删除电话号码格式以仅获取数字的好方法是什么?

ios - 如何从不同的函数检索 Realm 对象? swift

objective-c - 如果dispatch_group_enter和dispatch_group_leave不匹配会发生什么?

ios - 验证用于 XMPPFramework iOS 的 SSL/TLS 版本

iPhone 不调用指定号码,我想知道为什么?