Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 Obj-c中self.instanceVar=X和instanceVar=X之间的差异_Iphone_Objective C - Fatal编程技术网

Iphone Obj-c中self.instanceVar=X和instanceVar=X之间的差异

Iphone Obj-c中self.instanceVar=X和instanceVar=X之间的差异,iphone,objective-c,Iphone,Objective C,对于obj-c类中的以下两行: self.instanceVar = X instanceVar = X 唯一的区别是“self”版本调用合成的“setter”,而后者只设置instanceVar而不经过setter 谢谢是的self.instanceVar通过属性访问值 虽然不一定是合成性质。您可以编写自己可以调用的get和set方法。是。这意味着合成的getter将根据属性的指定方式包装其他代码,因此使用assign/retain/copy以及非原子/原子将改变行为。想象一下: @pro

对于obj-c类中的以下两行:

self.instanceVar = X
instanceVar = X 
唯一的区别是“self”版本调用合成的“setter”,而后者只设置instanceVar而不经过setter


谢谢

是的self.instanceVar通过属性访问值


虽然不一定是合成性质。您可以编写自己可以调用的get和set方法。

是。这意味着合成的getter将根据属性的指定方式包装其他代码,因此使用assign/retain/copy以及非原子/原子将改变行为。

想象一下:

@property( retain ) NSString * myprop;
如果通过
self.myprop
进行设置,则NSString实例将被保留

如果直接设置实例变量,则不会出现这种情况


因此,请始终使用
self.
,除非您绝对确定…

这是一个很好的问题,了解通过其访问器设置变量与直接分配变量之间的区别非常重要

发生的情况如下:当您在标头中声明一个
@属性(非原子,保留)NSString*变量时,您将向对象添加一个属性。很简单。调用
@synthesis
执行以下操作:它在类中生成两个方法,
setVariable:
getVariable
。当然,如果您将属性命名为“name”,那么方法将是
setName:
getName

现在,了解
setVariable:
方法中发生的事情对您来说很重要。该方法声明如下:

- (void)setVariable:(NSString *)theVariable {
    if (variable != nil) {
        [variable release];
    }

    // variable is the class member, 
    // theVariable is the object that was sent by the method parameter
    variable = [theVariable retain];
}
当您调用
self.variable=@“test”时
您将实际调用
[self setVariable:@“test”]
,这正是
@synthesis
调用生成的方法

当您调用
variable=@“test”时您只需这样做-将字符串分配给变量,而不保留它或任何内容

如果要调用
self.variable=nil
,变量的当前值将被释放,变量将被分配到
nil
,但如果要调用
variable=nil
,则只需放弃对先前分配的值(对象)的引用。因此,如果你想打电话

self.variable = @"test";
// wrong, do not do this in this case
variable = nil;
您将生成内存泄漏,因为分配给变量并通过其访问器保留的@“test”对象永远不会被释放。为什么?因为setter(setVariable:)永远不会被调用来释放先前持有的值

举个例子,下面是
getVariable
的样子:

- (void)getVariable {
    // variable is the class member
    return variable;
}

如果您还有其他问题,请告诉我。

谢谢您的建议-因此,基本上,请始终使用“self”。感谢您为我澄清这一点。尽管总是使用self本身并没有错,但如果您在循环中访问许多基本类型(int/float/bool等),您确实需要注意性能的影响,这可能非常重要。在cows回家之前,您可以一直争论这个问题,但一般来说,我会从类中访问基本类型,而不使用self。任何其他物体,最好使用self,除非你确定发生了什么。