Ios 将局部变量指定给属性时出现内存泄漏弧
我使用的是ARC,我的代码如下:Ios 将局部变量指定给属性时出现内存泄漏弧,ios,iphone,objective-c,automatic-ref-counting,xcode-instruments,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];
-(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)
}
我的内存泄漏原因如下:
谢谢。我自己必须回答这个问题,谢谢@abizern。实际上,泄漏是由_var造成的。_var只是实例变量的一个不同名称(大概是为了在打算使用访问器时不会意外地直接访问它)。在提供给我的代码中,意外地将_var分配给self.var。 我只是简单地创建了@property(nonatomic,retain)并将其用作实现文件中的self.var。不再有内存泄漏。arc中的属性也是自动合成的,因此不再需要显式删除@synthesis 在浏览开发人员apple时,我发现: 在本例中,很明显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
//或[自我设置字符串:myString];
}多亏了@abizern,我自己不得不给出这个问题的答案。实际上,泄漏是由于_var造成的。_var只是实例变量的一个不同名称(大概是为了在打算使用访问器时不会意外地直接访问它)。在提供给我的代码中,我意外地将_var分配给了self.var。 我只是简单地创建了@property(nonatomic,retain)并将其用作实现文件中的self.var。不再有内存泄漏。arc中的属性也是自动合成的,因此不再需要显式删除@synthesis 在浏览开发人员apple时,我发现: 在本例中,很明显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
//或[自我设置字符串:myString];
}y r u试着做self.popover=\u popover你为什么要把popover分配给它自己?@Abizern但非传统和糟糕的代码现在已经司空见惯了。似乎大学课程主要是关于编写代码以获得正确答案,而不是关于如何编写干净、简洁和易懂的代码。如何编写代码的最佳实践似乎并不存在。上个月,我有几个“编码员”告诉我,他们认为单一方法在8000行长度上没有问题。如今,许多编码似乎都是偶然发生的,而不是精心设计的。“很少关注惯例。”扎夫,这就是为什么指出这点很重要。许多刚接触iOS的程序员都不知道有约定。我甚至还写了我的::)@Maddy你可以自己回答并接受它。这是完全可以接受的行为。我在这里的工作完成了。:)你在试着做self.popover=\u popover你为什么要把popover分配给它自己?@Abizern但是非传统的和糟糕的代码现在已经成为常态。似乎大学课程主要是关于编写代码以获得正确答案,而不是关于如何编写干净、简洁和易懂的代码。如何编写代码的最佳实践似乎并不存在。上个月,我有几个“编码员”告诉我,他们认为单一方法在8000行长度上没有问题。如今,许多编码似乎都是偶然发生的,而不是精心设计的。“很少关注惯例。”扎夫,这就是为什么指出这点很重要。许多刚接触iOS的程序员都不知道有约定。我甚至还写了我的::)@Maddy你可以自己回答并接受它。这是完全可以接受的行为。我在这里的工作完成了。:)