zoukankan      html  css  js  c++  java
  • UIPopoverController在ARC环境下用法注意

    在ARC环境下如果便用以下代码:

    1. UIViewController *viewTwo;  
    2. viewTwo = [[ViewTwo alloc] initWithNibName:@"ViewTwo" bundle:nil];  
    3.   
    4. UIPopoverController *popover;  
    5. popover = [[UIPopoverController alloc] initWithContentViewController:viewTwo];    
    6.   
    7. [popover presentPopoverFromRect:[theButton bounds]   
    8.                          inView:theButton   
    9.        permittedArrowDirections:UIPopoverArrowDirectionLeft   
    10.                        animated:NO];  
    UIViewController *viewTwo;
    viewTwo = [[ViewTwo alloc] initWithNibName:@"ViewTwo" bundle:nil];
    
    UIPopoverController *popover;
    popover = [[UIPopoverController alloc] initWithContentViewController:viewTwo];  
    
    [popover presentPopoverFromRect:[theButton bounds] 
                             inView:theButton 
           permittedArrowDirections:UIPopoverArrowDirectionLeft 
                           animated:NO];


    结果会crash,原因是ARC环境下,popover是它的作用域中是有效的,如果起出其作用域就会被编译器加入的release释放内存。由于当前popup还在显示期,而controller被回收了,所以会出现crash。xcode的console里crash的reason就有说明。

    于是在ARC环境下正确的做法是保持popover的生命周期。让popover是strong类型的成员变量或属性。 当收到UIPopoverController dismiss的消息的时候将popover=nil;这样就可以正常便用了。如:

     

    1. - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController  
    2. {  
    3.     popover = nil;  
    4. }  
    - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
    {
        popover = nil;
    }


    还有在iPad下使用UIImagePickerController的时候得注意了,如果它的sourceType是UIImagePickerControllerSourceTypeCamera则可以用[self

    presentModalViewController:vc animated:Yes];的方法显示UIImagePickerController的view用于照相,如果sourceType是UIImagePickerControllerSourceTypePhotoLibrary或UIImagePickerControllerSourceTypeSavedPhotosAlbum 相片选择的UIImagePickerController,那么得将UIImagePickerController放在UIPopoverController中才能正常显示。这是iPad下的规则。

  • 相关阅读:
    su 命令切换用户带来的问题
    系统无法启动
    Linux单用户模式
    反射
    propety/静态方法
    内置方法,序列化模块
    第1月5周3天
    第1月4周5天
    第1月4周4日
    第1月4周3日
  • 原文地址:https://www.cnblogs.com/zhwl/p/2846173.html
Copyright © 2011-2022 走看看