(1)屏幕尺寸与模拟器尺寸
当前设置屏幕尺寸
CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
NSLog(@"screenW:%f,screenH:%f",screenW,screenH);
控制器View的尺寸
CGFloat width = self.view.frame.size.width;
CGFloat height = self.view.frame.size.height;
NSLog(@"viewW=:%f,viewH=:%f",width,height);
控制器View上子视图titleScrollView(基于AutoLayout)的尺寸
CGFloat scrollViewW = self.titleScrollView.frame.size.width;
CGFloat scrollViewH = self.titleScrollView.frame.size.height;
NSLog(@"scrollW:%f,scrollH:%f",scrollViewW,scrollViewH);
Q:AutoLayout约束下,titleScrollView为什么不随控制器View尺寸的变化而变化?又为什么随预览模式的变化而变化?(2)给出了回答。
(2)viewDidLoad: 当控制器View加载完毕时调用
我们经常会在这个方法里面手动做一些控件的初始化操作,其中可能会给一些控件设置尺寸位置,但是需要注意的是在这个方法内【只能参照】控制器的view的尺寸,不能参照其他子控件的尺寸!因为该方法的调用仅仅表明了控制器view的加载完成(即有了真实的尺寸),在快要显示view时(
viewWillAppear
)查看有无通过xib/storyboard创建的子控件;而通过xib/storyboard创建的子view此时还未加载!子view的加载是在viewWillLayoutSubviews
、viewDidLayoutSubviews
中完成的,此后才会执行viewDidAppear
方法。实验得知,在viewDidAppear
中拿到了子控件的真实尺寸。
四个方法的执行顺序
- (void)viewDidLoad {
[super viewDidLoad];
//
}
(3)引用计数器
(4)self.label2
与_label2
的区别:
strong关键字修饰属性时,可以【持有(指的是引用计数增加)】被赋值进来的对象,而成员变量得到对象的地址后却不能【持有】对象,只能【访问】对象,说明set方法内部实现不仅仅是
_label = label;
这么简单!
由此可见,对于局部对象,引用计数一旦为0,则对象会被立即“隔离”起来,拒绝接受访问。
由此可见,当对象的引用计数为0时,对象本身被隔离了起来,不接受外界访问。但此时指针的值还在(不为nil),于是成为了野指针。
预测失败表明,指针赋值并不会导致对象的引用计数增加!只是增加了一个访问的“途径”而已。所以,当一个对像的引用计数为0的时候,可能会存在多个“野指针”,有些指针会被自动置为nil(比如weak指针),有些不会(比如assign指针)。“假引用”(1)
综上所述:
(1)将子控件添加进父控件中时,子控件的引用计数加1;
(2)用全局的成员变量“接收”一个局部子控件时,不会导致子控件的引用计数加1,只是增多了一个访问对象的【途径】;
通过strong属性的set方法“接收”一个局部子控件时,会导致子控件的引用计数加1【途径】;
(3)一个对像可能同时会有多个指针指向它,当该对象的引用计数器为0时,一些指针会被自动置为nil(比如weak型指针),一些指针不会被自动置为nil的(比如assign指针、“假引用”指针:全局的成员变量型指针等)指针成为了“野指针”;