美文网首页
iOS中的指针

iOS中的指针

作者: FishSha | 来源:发表于2018-11-20 09:13 被阅读96次

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

相关文章

  • iOS 方法中 单指针和双指针的区别

    iOS 双指针 iOS 单指针,双指针在方法参数中的区别 传入单指针,在方法内会复制一个临时的指针副本,在方法内操...

  • iOS中的指针

    刚看到一篇文章说到iOS指针方面,这里简单写个Demo演示下指针之间的传递,先看下面的代码: 两个问题:1、vie...

  • iOS监控-野指针定位

    iOS监控-野指针定位 iOS监控-野指针定位

  • iOS中的weak指针

    ObjC runtime是如何实现weak指针的 用strong指针创建weak指针,系统会调用objc_init...

  • iOS中的isa指针

    什么是isa OC是一门面向对象的语言,每一个对象都是类的一个实例,在OC语言内部,每一个对象都有一个isa指针,...

  • iOS中的isa指针

    isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的...

  • 从两道面试题说起

    iOS 中是否存在野指针的情况? 野指针 野指针指向一个已删除的对象或未申请访问受限内存区域的指针。特别要指出的是...

  • iOS 最详细的解析(数组与指针)笔试题

    iOS 最详细的解析(数组与指针)笔试题 iOS 最详细的解析(数组与指针)笔试题

  • iOS中的野指针、僵尸对象、空指针

    野指针 野指针和空指针是不一样的,空指针没有储存任何的内存地址,而野指针指向的一块内存地址,但是该内存不可用。换句...

  • iOS block 中野指针

    在MRC环境下,如果在block中调用了野指针会出现崩溃的情况。比如下面的场景: mrc 环境下: 在一个view...

网友评论

      本文标题:iOS中的指针

      本文链接:https://www.haomeiwen.com/subject/pectqqtx.html