将本地变量分配给属性时的内存泄漏弧

Posted

技术标签:

【中文标题】将本地变量分配给属性时的内存泄漏弧【英文标题】:memory leak arc when assigning local var to property 【发布时间】:2013-11-19 13:11:45 【问题描述】:

我正在使用 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)

我的内存泄漏为:

谢谢。

【问题讨论】:

你尝试做 self.popover = _popover 你为什么要给自己分配popover? @Abizern 但是现在非常规和糟糕的代码是常态。似乎大学课程主要是关于编写代码以获得正确答案,而不是关于如何编写干净、简洁和易于理解的代码。如何编写代码的最佳实践似乎不存在。上个月,我有几个“编码员”告诉我,他们认为使用 8,000 行长度的单一方法没有问题。如今,许多编码似乎都是偶然的,而不是经过精心设计的。对约定没有什么顾虑。 @Zaph 这就是为什么指出这一点很重要。许多刚接触 ios程序员并不知道有约定。我什至写了我的:abizern.org/cocoa-coding-conventions :) @Maddy 你可以自己回答并接受它。这是对 SO 完全可以接受的行为。我在这里的工作已经完成了。 :) 【参考方案1】:

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

在浏览开发者苹果时,我发现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];

【讨论】:

以上是关于将本地变量分配给属性时的内存泄漏弧的主要内容,如果未能解决你的问题,请参考以下文章

ThreadLocal 内存泄漏 代码演示 实例演示

InheritableThreadLocal:子线程继承父线程的本地变量

JavaScript内存管理闭包和内存泄漏

JVM垃圾收集器与内存分配策略

前端如何处理内存泄漏

将视图控制器分配给 prepareForSegue 中的变量时的 Swift EXC_BREAKPOINT