【问题标题】:Objective C difference between self.variable and variable assignments自变量和变量赋值之间的Objective C区别
【发布时间】:2010-06-21 21:38:08
【问题描述】:

我担心我很愚蠢。

我花了大约三个小时来追踪一直在破坏我的理智的内存泄漏,在注释掉我的一半应用程序后,我得出了以下结论。

在正确的地方给出以下内容。

NSString *blah;

@property (nonatomic, retain) NSString *blah;

@synthesize blah;

-(id)initWithBlah:(NSString*)b {

     self.blah = b;    //this leaks
     blah = b;         //this does not

}

我对objectice c不是特别有经验,我明白如果我在课堂外调用object.blah = b;我会透明地调用一个 setter 函数来保留 b。在我假设的函数内部,通过 self.blah = b 设置它我出于某种原因双重保留?

有人可以向我解释为什么会这样,否则我可能做错了什么?

干杯

【问题讨论】:

    标签: objective-c memory-leaks setter


    【解决方案1】:
    blah = b
    

    直接修改类实例变量。

    self.blah = b
    

    将调用访问器(如果存在) - 从而根据需要保留、释放资源。

    您应该在您的 dealloc 方法中添加 [blah release]; 以在您的类被释放时释放资源。

    【讨论】:

      【解决方案2】:

      你错了。 blah = b; 赋值没有多大意义,因为在您的代码从 initWithBlah: 返回后,您不能再依赖周围的字符串。每当您下次访问它时,它很可能已经被释放了。

      self.blah = b; 赋值是正确的,因为它调用了 setter,因此您获得了字符串的所有权。当然,您也必须在您的-dealloc 中释放blah,以防止内存泄漏。

      【讨论】:

      • 啊谢谢。出于某种原因,我假设由于设置器透明地执行保留,因此某些代码会记住它的存在并在销毁时透明地为我释放它。谢谢,解决了我的问题。
      • 顺便说一下,对于NSString * 变量,约定是使用@property (nonatomic, copy) 而不是(nonatomic, retain)。使用保留,另一个对象可以为您的属性分配一个可变字符串,然后在您的类注意到它的情况下修改字符串的内容,这会破坏封装。
      【解决方案3】:

      如果你只给 blah,它不会为字符串分配,如果你给 self.blah,它会尝试启动 self 并为 self 类分配并尝试为你试图访问的变量分配,所以你必须释放它或在 dealloc 方法中设置 blah=nil。

      - (void)dealloc 
      
      {
      
           self.blah = nil;
      
            or
      
          [self.blah release];
      
      }
      

      【讨论】:

        【解决方案4】:

        使用访问器没问题,如果它泄漏了,那就是其他问题。

        特别是必须正确调用您的初始化程序,即遵循 Cocoa 内存管理指南,即参数不由被调用者隐式拥有。

        所以以下内容会很好,因为它会传递一个自动释放的字符串:

        YourObj *obj = [[YourObj alloc] initWithBlah:[NSString stringWithString:@"blah"]];
        

        虽然由于传入保留字符串而导致以下泄漏:

        YourObj *obj = [[YourObj alloc] initWithBlah:[[NSString alloc] initWithString:@"blah"]];
        

        您必须注意的另一件事是声明的属性不会自动进行清理,因此请务必在 -dealloc 中处理:

        - (void)dealloc {
            self.blah = nil;
            // ...
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-06
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-16
          • 2013-02-13
          • 1970-01-01
          相关资源
          最近更新 更多