Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 内部属性与IVAR_Iphone_Objective C_Ios_Automatic Ref Counting - Fatal编程技术网

Iphone 内部属性与IVAR

Iphone 内部属性与IVAR,iphone,objective-c,ios,automatic-ref-counting,Iphone,Objective C,Ios,Automatic Ref Counting,当我需要私有对象时,我当前使用属性,如: // Class extension in .m file @interface MyClass() @property (strong, nonatomic) NSArray* myInternalArray; @end self.myInternalArray = something; 或者,您可以执行以下操作: @implementation MyClass { NSArray* _myInternalArray; } _myIn

当我需要私有对象时,我当前使用属性,如:

// Class extension in .m file
@interface MyClass()
@property (strong, nonatomic) NSArray* myInternalArray;
@end

self.myInternalArray = something; 
或者,您可以执行以下操作:

@implementation MyClass {

    NSArray* _myInternalArray;
}

_myInternalArray = something;

如果没有自定义setter或getter,这两者是等效的。内部变量的最佳实践是什么?一种方法比另一种方法有什么优点吗?

我想说,属性的优点是可以使用setter,setter可以独立于调用它们的代码而发展。例如,您可以决定设置属性将触发setNeedsLayout。通过从一开始就使用属性,您无需重构现有代码

这种模式非常适合Cocoa/iosapi,在Cocoa/iosapi中,您不必在更改系统对象的属性后要求系统对象执行任何操作:setter立即确保内部和UI的一致性


属性是私有的这一事实不应该让我们将它们实现为二级属性,你认为呢?

虽然有些人可能会认为选择是偏好的问题,而且它们确实有其道理,但有一个很好的理由,大多数现代语言都支持属性,并使它们越来越容易编码

引入ARC不会显著降低特性的值。归根结底,在一个属性中,您封装了变量的使用。这种封装在需要时是非常宝贵的,而在不需要时不会有太多开销

例如(在我的脑海中)假设您发现在保存之前需要验证该值。如果您使用的是iVar,那么您必须确保在使用iVar的任何地方,在允许更改其值之前,都有一个对验证代码的调用。对于属性,您只需要覆盖
setIVarName:
并将验证放在那里。有人可能会争辩说,一个和另一个一样简单——在许多情况下可能是这样,但iVar存在一个障碍——您无法确保将来的更改(由您或其他编码人员)会在iVar更改之前插入验证。在这里使用房产确实有这样的保证


就我个人而言,我尽可能使用IVAR上的属性。

对于类似的问题,有一个非常详细的答案可能会对您有所帮助。您的第一部分和第二部分并不等同:在您的第一部分中,您创建了一个支持ivar的私有财产。因此,您可以使用self.myInternalArray或_myInternalArray等,但在第二部分中,没有属性。所以self.myInternalArray不起作用,但_myInternalArray会起作用。很好,我完全忘记了自定义设置程序。您可能会说,它们的使用频率远低于外部属性,但我认为这是最佳实践。