将本地变量分配给属性时的内存泄漏弧
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];
【讨论】:
以上是关于将本地变量分配给属性时的内存泄漏弧的主要内容,如果未能解决你的问题,请参考以下文章