iOS:使用self导致内存泄漏?

时间:2011-08-02 20:38:37

标签: objective-c ios memory-leaks

在XCode 4中使用分析器,由于设置了这样的属性,我收到有关潜在内存泄漏的警告:

self.newDog.dogName = self.dogNameTextField.text;

具体警告是:

  1. 属性返回一个具有+1保留计数(拥有引用)的Objective-C对象。

  2. 第513行分配的对象以后未在此执行路径中引用,并且保留计数为+1(对象泄露)

  3. 如果我没有使用self设置属性,则警告消失......但我不确定这是否会导致其他问题,因为我读过的所有内容基本上都表示在设置时始终使用self得到属性:

    newDog.dogName = self.dogNameTextField.text;
    

    我在这里做错了吗?以下是视图控制器中发生警告的一些精简代码:

    @interface AddDogViewController : UITableViewController {
        Dog *newDog;
    }
    
    @property (nonatomic, retain) Dog *newDog;
    
    
    
    
    @implementation AddDogViewController
    
    @synthesize newDog;
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
        // some other code
    
        self.newDog.dogName = self.dogNameTextField.text;
    
        // some other code
    }
    
    
    - (void)dealloc {
        [newDog release];
        [super dealloc];
    }
    
    @end
    

2 个答案:

答案 0 :(得分:8)

根据内存管理规则,以new开头的方法会返回+1保留计数(就像alloccopy)。您的访问者newDog具有此名称。

您应该将属性重命名为不以new开头的内容。请注意,您实际上并没有泄漏任何东西。你只是混淆了分析器,因为你违反了命名规则。

答案 1 :(得分:2)

这是因为当您访问执行ivar的{​​{1}}时,您正在使用self.myIvar setter方法执行此操作,因此如果它被声明为synthesized,它会向其发送另外的retain消息。

如果直接访问私有变量,即不使用不使用retain的setter,则不会发生这种情况。