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下的规则。

  • 相关阅读:
    获取父窗口的xxx节点的方法
    enumeration
    关于Java正则表达式的一些理解
    简单JNI的使用在Java中调用C库函数
    cursor管理
    [转]Vim配置与高级技巧
    [转]Vim+Taglist+Ctags
    在Windows下面使用cygwin将含有JNI的C文件编译成DLL文件
    vim转换大小写
    JMeter学习资料集锦
  • 原文地址:https://www.cnblogs.com/zhwl/p/2846173.html
Copyright © 2011-2022 走看看