Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将局部变量指定给属性时出现内存泄漏弧_Ios_Iphone_Objective C_Automatic Ref Counting_Xcode Instruments - Fatal编程技术网

Ios 将局部变量指定给属性时出现内存泄漏弧

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];

我使用的是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)
}
我的内存泄漏原因如下:


谢谢。

我自己必须回答这个问题,谢谢@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你可以自己回答并接受它。这是完全可以接受的行为。我在这里的工作完成了。:)