2019-01-05

(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)给出了回答。


更改预览模式下的view

(2)viewDidLoad: 当控制器View加载完毕时调用

我们经常会在这个方法里面手动做一些控件的初始化操作,其中可能会给一些控件设置尺寸位置,但是需要注意的是在这个方法内【只能参照】控制器的view的尺寸,不能参照其他子控件的尺寸!因为该方法的调用仅仅表明了控制器view的加载完成(即有了真实的尺寸),在快要显示view时(viewWillAppear)查看有无通过xib/storyboard创建的子控件;而通过xib/storyboard创建的子view此时还未加载!子view的加载是在viewWillLayoutSubviewsviewDidLayoutSubviews中完成的,此后才会执行viewDidAppear方法。实验得知,在viewDidAppear中拿到了子控件的真实尺寸。

四个方法的执行顺序

- (void)viewDidLoad {
    [super viewDidLoad];
    // 
}

(3)引用计数器

局部对象

(4)self.label2_label2的区别:

通过成员变量直接持有

通过set方法持有

strong关键字修饰属性时,可以【持有(指的是引用计数增加)】被赋值进来的对象,而成员变量得到对象的地址后却不能【持有】对象,只能【访问】对象,说明set方法内部实现不仅仅是_label = label;这么简单!

全局对象(1)

由此可见,对于局部对象,引用计数一旦为0,则对象会被立即“隔离”起来,拒绝接受访问。

全局对象(2)

由此可见,当对象的引用计数为0时,对象本身被隔离了起来,不接受外界访问。但此时指针的值还在(不为nil),于是成为了野指针。

全局对象(3)

预测失败表明,指针赋值并不会导致对象的引用计数增加!只是增加了一个访问的“途径”而已。所以,当一个对像的引用计数为0的时候,可能会存在多个“野指针”,有些指针会被自动置为nil(比如weak指针),有些不会(比如assign指针)。
“假引用”(1)

综上所述:
(1)将子控件添加进父控件中时,子控件的引用计数加1;
(2)用全局的成员变量“接收”一个局部子控件时,不会导致子控件的引用计数加1,只是增多了一个访问对象的【途径】;
通过strong属性的set方法“接收”一个局部子控件时,会导致子控件的引用计数加1【途径】;
(3)一个对像可能同时会有多个指针指向它,当该对象的引用计数器为0时,一些指针会被自动置为nil(比如weak型指针),一些指针不会被自动置为nil的(比如assign指针、“假引用”指针:全局的成员变量型指针等)指针成为了“野指针”;

你可能感兴趣的:(2019-01-05)