iOS中的指针

刚看到一篇文章说到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(0010050);
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: 0x7fe754e050b0frame = (0 0100 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(0010050);
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


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 你我相遇 像鱼尾划开的水波 淡淡的痕迹 渐渐地抹平 只记得你 冬日暖阳下唇角微扬 不曾去想 憩身角落里独自哭泣 回...
    青菜1004阅读 274评论 0 0
  • 为什么是在这里,而不是别的地方?为什么会烦,而不是侧耳倾听?位置决定你到底在哪里?想到哪些地方去?位置告诉你要成为...
    风在睡觉阅读 410评论 0 0
  • 突然觉得行走在这个热的火急火燎的城市自己也快要被融化了一样…… 什么才是安全感? 以前听朋友说安全感就是男朋友速速...
    戴蝴蝶结的豆豆阅读 211评论 0 1