刚看到一篇文章说到iOS指针方面,这里简单写个Demo演示下指针之间的传递,先看下面的代码:
1-?(void)viewDidLoad?{
2????[super?viewDidLoad];
3????UILabel?*?title?=?[[UILabel?alloc]?init];
4????title.text?=?@"Article?title";
5????title.backgroundColor?=?UIColor.redColor;
6????title.frame?=?CGRectMake(0,?0,?100,?50);
7????[self.view?addSubview:title];
8????[self?changeTitlte:title];
9????NSLog(@"%@",?title);
10}
11-?(void)changeTitlte:(UILabel?*)label
12{
13????label.text?=?@"New?article?title";
14????label.backgroundColor?=?UIColor.blueColor;
15????[label?removeFromSuperview];
16????label?=?nil;
17}
两个问题:
1、view中的title是否会被修改Text和backgroudColor属性;
2、log中输出是nil还是UILabel对象
我们还是先说答案:
1、会被修改;
2、输出UILabel对象
下面我们讨论下原因,也就是这次的主题指针变量。
1、首先我们解析一下上面代码的执行过程
2、在内存中创建UILabel对象,并将指针变量赋值给title;
3、通过title这个指针变量中的地址,找到其在内存中的对象,修改其text和- backgroundColor属性;
4、通过title这个指针变量中的地址,找到其在内存中的对象,修改其frame属性;
5、将UILabe添加到当前View中;
6、发送消息到changeTitle,将实参title拷贝传递给形参label;
7、通过label这个指针变量中的地址,找到其在内存中的对象,修改其text和backgroudColor属性;
8、将UILabel从当前View中移除;
9、将label这个指针变量,赋值nil;
10、打印log,输出title这个指针变量,输出如下:
1?<UILabel:?0x7fe754e050b0;?frame?=?(0?0;?100?50);?text?=?'New?article?title';?userInteractionEnabled?=?NO;?layer?=?<_UILabelLayer:?0x6000000a88c0>>
2
相信看完这个执行过程,你应该也完全明白了为什么输出不是nil而是UILabel的指针变量了。
那如果我们就是需要将title的对象赋值为nil该怎么办呢?
其实我们可以通过二级指针在操作内存中的对象
1-?(void)viewDidLoad?{
2????[super?viewDidLoad];
3????UILabel?*?title?=?[[UILabel?alloc]?init];
4????title.text?=?@"Article?title";
5????title.backgroundColor?=?UIColor.redColor;
6????title.frame?=?CGRectMake(0,?0,?100,?50);
7????[self.view?addSubview:title];
8????[self?changeTitlte:&title];
9????NSLog(@"%@",?title);
10}
11-?(void)changeTitlte:(UILabel?*__strong?*)label
12{
13????[*label?setText:?@"New?article?title"];
14????[*label?setBackgroundColor:UIColor.blueColor];
15????[*label?removeFromSuperview];
16????*label?=?nil;
17}
简单说明下
1、设置参数二级强指针类型;
2、在发送参数到该消息时,通过“&”取地址符,获取title的地址进行传递;
3、label接受到UILabe对象的地址信息;
4、因为无法直接操作地址,则通过“*”解引用符,获取该引用地址的实际内存对象;
5、设置该对象的text和backgroundColor属性;
6、将该对象从当前View中移除
7、将该对象赋值为nil;
8、打印log,输出title这个指针变量,输出如下:
1(null)
上设置参数二级强指针类型,在发送参数到该消息时,需要通过“&”获取指针变量的地址,传递给label,label