代码之家  ›  专栏  ›  技术社区  ›  mk12

iphone dev-viewdidload和viewdidunload在以编程方式创建的视图中?

  •  1
  • mk12  · 技术社区  · 16 年前

    我在某个地方读到,在uiviewcontroller中以编程方式创建的视图中,没有使用Interface Builder, -viewDidLoad -viewDidUnload 不应使用。这是对的吗?为什么?我将在哪里发布保留属性的子视图?或者我应该不为它们使用属性吗?

    编辑 :阅读我对Rob Napier答案的评论。

    2 回复  |  直到 14 年前
        1
  •  0
  •   stigi    16 年前

    在中创建子视图 -viewDidLoad . 如果您需要为它们指定ivar,那么只分配它们的值。通过将视图作为子视图添加到主视图中,可以保留引用。

    然后,当卸载视图时,您应该将IVARS设置为零,因为该对象在视图被删除和释放后已被释放。

    所以在你的头上

    @interface MyViewController : UIViewController {
      IBOutlet UIView *someSubview; // assigned
    }
    @property (nonatomic, assign) IBOutlet UIView someSubview;
    @end
    

    在你的实施中

    @implementation MyViewController
    //... some important stuff
    
    - (void)viewDidLoad;
    {
      [super viewDidLoad];
      someSubview = [[UIView alloc] initWithFrame:self.view.bounds];
      [self.view addSubview:someSubview]; // retains someSubview
      [someSubview release];   // we don't hold it
    }
    
    - (void)viewDidUnload;
    {
      [super viewDidUnload];
      someSubview = nil;  // set the pointer to nil because someSubview has been released
    }
    
    //... more important stuff
    
    @end
    

    如果你愿意你也不能释放 someSubview 在里面 视图加载 但是你得把它放进去 -viewDidUnload -dealloc 因为(如果我记得对的话) -视图加载 以前没打过电话 -DELOLLC . 但如果你不保留 体视图 .

        2
  •  0
  •   nebillo    15 年前

    奇怪的是,没有从NIB文件加载的uiviewController不会收到有关其视图卸载的通知(因此不会调用其viewdidUnload方法),除非您提供了loadView方法的基本实现,例如:

    - (void)loadView {
       self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];
       [self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
    }
    
    - (void)viewDidLoad {
       [super viewDidLoad];
       // create views...
    }
    
    
    - (void)viewDidUnload {
       // destroy views...
       [super viewDidUnload];
    }
    

    这只发生在基础uiviewcontroller上,例如,uitableviewcontroller不需要用此解决方法修复。

    所以机器人是对的。

    推荐文章