理解:
UIViewController在初始化给window的时候就会自动调用loadview方法,父类中这个方法的意思就是,是否有xib或者storybord来创建一个view,来赋值给视图控制器的属性view,没有的话就穿就一个新的空的view来赋值,,,,,这是调用父类的loadview
我们还可以复写这个loadview,复写的时候就不用调用父类的loadview了,如果那样就没有意义了,我们新建一个自己的view来给控制器就可以了。
其实最终目的就是,试图控制器初始化的时候必须初始化内部的view属性。
其实触发loadview方法的是,只要控制器要用到视图的时候,并且此控制器没有view就会通过loadview来获得一个view,如果有的话,就不会触发loadview,,因为当出现内存警告的时候,会卸载掉不在主窗口的控制器的view,再次将这个控制器到主窗口的时候就需要view,就会触发loadview
6.0以前出现内存警告的时候,会调用viewWillUnload,viewdidunload来卸载不在主窗口上的控制器的view
6.0之后出现内存警告的时候,会调用didreceivememorywaining来达到相应的效果
6.0之后是要我们自己写的
-(void)didReceiveMemoryWarning{
if([self.view window]==nil){//这个判断方法就是下面这个是否能拿到window的一种应用
self.view=nil;
}
}
拿到window的2中方法
1、[UIApplication shareApplication].keyWindow;//一定能返回window
2、self.view.window//这是在试图控制器中,当这个视图控制器没有占用window的话是不能获得window的,相反的当这个试图控制器占用着这个window你就可以通过这个方法来获得window
-(void)viewDidUnload{
[super viewDidUnload];
_uiview=nil;//_uiview是此控制器的一个强引用,是一个全局的,是此控制器的view的一个子视图
}
//当在6.0之前,出现内存警告的时候,并且此控制器没有在窗口上,此控制器的视图就会被卸载,并且也会用nil赋值,此时其内部的视图也会被释放,但是当其子视图是一个强引用(就是一个全局的变量),那么这个指针就会指向一个空的地方,就是所谓的野指针,就容易出bug,当然局部的变量就不存了,出了大括号就消失了,其实能加给别人做子视图,不过是别人又个subview的数组来装自己的子视图,释放的时候自己的数组自然野会释放,不会出现野指针,,,,所以总结的就是最后将强引用放空很重要。
//貌似将一个_uiview=nil的时候,这个对象的引用计数器会-1;//所以创建的时候不能释放,这样就会造成多次释放的bug,比如
所以上面的心得就错了,
新的心得:所以全局的ui的时候在创建的时候不能释放,这样就会造成多次释放,比如:我们的宗旨是谁污染是释放,当一个全局的ui穿就的时候我们将其加给一个父视图,引用计数+1,再出现内存警告要释放这个父视图的时候此子视图又会-1,就被释放干净了,执行-(void)viewDidUnload的时候又去_uiview=nil再释放一次就会出现错误,因为我们是全局的可能会给多个视图作为子视图,所以我们就不再创建的时候就释放,最后按照上面的那个样子执行一次。
我靠,先不管上面的心得..等有时间再看一次,觉得绿色的是正确的心得
- (void)didReceiveMemoryWarning//这个是6.0之后调用的方法
{
[super didReceiveMemoryWarning];
if (self.view.window==nil) {//此代码的意思就是这个view是否在窗口上,看是否需要释放
self.view=nil;//6.0之前出现内存警告系统帮我们做了这句代码,6.0之后需要我们自己写
_uiview=nil;//同理和上面6.0之前的一样,这里就是将其设置为空指针,防止野指针的出现罢了
}
}
上面的心得先不管,其实作祟的是下面这段代码
-(void)setBook:(Book)book{
[_book release];//[nil release]有可能为空
_book=[book retain];
}
//当内部调用Controller的init方法的时候会自动调用-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil方法,反之是不会调用init方法的,这是苹果内部的代码,估计就是在init里面调用了一下用初始化nib方法而已
//同理,view初始化的时候如果用init它也会自动调用initWithFrame方法,反之也不会调用init方法
这就是为什么在xcode6.0以前建立controler和view的子类的时候为什么都知复写initWithNibName和initFrame方法了,因为不管你用哪种内部都自动调用了这个对应的方法,xcode6.1.1以后就将这2个对应的复写方法也给祛除了,以后得自己写了
1.这里只记录一些学习笔记
2.这里只记录一些学习心得,如果心得方向有错,请留言
2.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)