【问题标题】:self function is used使用自我功能
【发布时间】:2011-03-22 09:56:35
【问题描述】:

为什么使用self ....self.something = manything;是什么意思

【问题讨论】:

    标签: iphone objective-c ios memory-management


    【解决方案1】:

    主要区别在于不使用 self 调用将直接访问变量,而通过 self 调用将调用 set/get 方法。有什么区别?

    因为您需要注意 Objective-C 中的内存,当您执行 something = manything; 时,很多东西都会附加到某物上,而之前附加到某物上的对象会丢失。

    最好的做法是使用 set 方法,它会在设置新对象之前释放旧对象。你可以记住,要设置一些东西,最好使用self.something


    一个清楚的例子:

    1) 如果你这样做(假设 myArray 是一个属性):BAD CASE

    NSArray *tmpArray = [NSArray arrayWithObjects:@"obj1", @"obj2", nil];
    myArray = tmpArray;
    

    第一行创建一个自动释放的数组,然后我们将这个数组分配给 myArray。如果 myArray 中有某些内容,则它不会被释放并且新数组不会保留。当我们尝试访问 myArray 之后,这将导致内存泄漏和崩溃,因为自动释放的数组将被释放。

    2) 如果你这样做:好的情况

    NSArray *tmpArray = [NSArray arrayWithObjects:@"obj1", @"obj2", nil];
    self.myArray = tmpArray; //Equivalent to [self setMyArray:tmpArray];
    

    我们在这里调用访问器方法,如果需要,此方法将负责释放旧对象(没有内存泄漏),如果还需要它,将保留新的分配对象(数组现在由我们的属性保留,并且可以将来可以访问)。

    => 继续,一切都与内存管理有关。

    【讨论】:

    • 这是对的,但您的答案假定某事物是没有显式 iVar 的 @property 或显式 iVar 也命名为某事物,但情况并非总是如此。在这种情况下,'self.something = foo;' imples '[self setSomething: foo];'这是正在发送的 Obj-C 消息。 '东西= foo;'暗示 'self->something = foo;'这是对 iVar 的直接分配,绕过了 setter 中的任何逻辑,因此绕过了任何 Key-Value 观察。如果您使用 KVO,那么您通常只想在 init 方法和 dealloc 中直接访问 iVar。
    【解决方案2】:

    每当你设置一个变量的属性&如果你想访问我们通常使用的同一个类中的属性

    self.(ObjectName)    //for accessing getter & setter method.
    

    另一个好处是,如果您也想使用其他类中的任何对象,我们用来合成该对象并创建该类的对象,我们可以访问该类的成员变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2017-03-03
      相关资源
      最近更新 更多