将本地var分配给属性时,内存泄漏弧

时间:2013-11-19 13:11:45

标签: ios iphone objective-c automatic-ref-counting xcode-instruments

我正在使用ARC,我的代码如下:

 -(void)viewAllCustomer:(id)sender
{           
    if([self.popOver isPopoverVisible])
    {
        [self.popOver dismissPopoverAnimated:YES];
    }


    CustomersViewController *allCustomer=[[CustomersViewController alloc]init];
    [allCustomer setDelegateAction:self];

    [allCustomer.view setFrame:CGRectMake(0, 0, 370, 420)];
    UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:allCustomer];
    UIPopoverController *_popOver=[[UIPopoverController alloc]initWithContentViewController:navController];
    [_popOver setPassthroughViews:[NSArray arrayWithObject:self]];
    [_popOver setPopoverContentSize:CGSizeMake(370, 420)];
    UIButton *button=(UIButton *)sender;

    //    60.0, 54.0

    CGRect buttonFrame=CGRectMake(button.frame.origin.x+25, button.frame.origin.y+35, 10,10);
    [_popOver presentPopoverFromRect:buttonFrame inView:self permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];


    self.popOver=_popOver;//popOver is (nonatomic,retain)
}

我得到内存泄漏: enter image description here

感谢。

1 个答案:

答案 0 :(得分:1)

我自己必须回答这个问题,感谢@ abizern。实际上泄漏是由于_var._var只是实例变量的一个不同名称(大概是你不小心直接访问它的时候)意思是使用访问器)。在提供给我的代码中意外地将_var分配给self.var。 我只是制作了@property(非原子,保留)并在实现文件中将它用作self.var。没有更多的内存泄漏。而且arc属性也是自动合成的,因此不再需要显式删除@synthesise。

在浏览开发者apple时发现this: 在这个例子中,很明显myString是一个局部变量,而_someString是一个实例变量。

通常,即使您从自己的实现中访问对象的属性,也应该使用访问器方法或点语法进行属性访问,在这种情况下,您应该使用self:

- (void)someMethod {
NSString *myString = @"An interesting string";//my bad was that i have taken _myString

self.someString = myString;//again self.someString = _myString //wrong

//或[self setSomeString:myString]; }