刚看到一篇文章说到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
网友评论