美文网首页
iOS-浅谈OC中的指针

iOS-浅谈OC中的指针

作者: 晴天ccc | 来源:发表于2019-04-15 11:10 被阅读0次

简介

在OC中,对象我们不能直接拿到,只能通过内存地址去操作对象。

我想下面这段代码大家都不陌生:

        // %p作用:输出内存地址
        NSObject *obj = [[NSObject alloc] init];
        NSObject *obj1 = [[NSObject alloc] init];
        NSLog(@"指针obj的内存首地址:%p ======= 指针obj指向对象的内存首地址:%p",&obj, obj);
        NSLog(@"指针obj的内存首地址:%p ======= 指针obj指向对象的内存首地址:%p",&obj1, obj1);

打印结果

        指针obj的内存首地址:0x16fdff2f8 ======= 指针obj指向对象的内存首地址:0x10071c2c0
        指针obj的内存首地址:0x16fdff2f0 ======= 指针obj指向对象的内存首地址:0x100710650

解析:

1、[NSObject alloc]调用alloc方法中开辟了一段内存空间,调用init方法初始化一个值。
2、通过打印结果可以看出 &obj输出的内存地址从高到低分配,而obj输出的内存地址是从低到高分配
3、系统会在中存储指针变量obj,而它所指向的实例对象存储在中。

  • 知识补充:OC应用程序内存地址分配规则:

扩展

        Student *stu0 = [[Student alloc] init];
        Student *stu1 = [[Student alloc] init];
        Student *stu2 = stu0;
        NSLog(@"指针stu0的内存首地址:%p ======= 指针stu0指向对象的内存首地址:%p",&stu0, stu0);
        NSLog(@"指针stu1的内存首地址:%p ======= 指针stu1指向对象的内存首地址:%p",&stu1, stu1);
        NSLog(@"指针stu2的内存首地址:%p ======= 指针stu2指向对象的内存首地址:%p",&stu2, stu2);
        指针stu0的内存首地址:0x16fdff2f8 ======= 指针stu0指向对象的内存首地址:0x100710750
        指针stu1的内存首地址:0x16fdff2f0 ======= 指针stu1指向对象的内存首地址:0x100719c60
        指针stu2的内存首地址:0x16fdff2e8 ======= 指针stu2指向对象的内存首地址:0x100710750

1、stu是一个指针变量,指向【利用NSString类进行 alloc - init 创建出来的实例对象】 的内存首地址。
2、在栈上分配一段内存用来存储指针变量stu,内存地址为0x16fdff2f8指针变量stu指针地址存储的内容则为0x100710750
3、stu = stu2不是修改的指针变量stu2在栈中的地址,而是修改stu2指针变量在内存中存储的内容。使得stustu2的指针指向地址相同。
4、通过指针找到内存中地址的对象来对对象进行操作。

  • 文章中代码

#import <Foundation/Foundation.h>

// Person
@interface Person : NSObject
{
    @public
    int _age;
}
@property (nonatomic, assign) int height;
@end

@implementation Person
@end

// Student
@interface Student : Person
{
    int _no;
    int _no2;
}
@end

@implementation Student
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // %p作用:输出内存地址
        NSObject *obj = [[NSObject alloc] init];
        NSObject *obj1 = [[NSObject alloc] init];
        NSLog(@"指针obj的内存首地址:%p ======= 指针obj指向对象的内存首地址:%p",&obj, obj);
        NSLog(@"指针obj的内存首地址:%p ======= 指针obj指向对象的内存首地址:%p",&obj1, obj1);
        
        Student *stu0 = [[Student alloc] init];
        Student *stu1 = [[Student alloc] init];
        Student *stu2 = stu0;
        NSLog(@"指针stu0的内存首地址:%p ======= 指针stu0指向对象的内存首地址:%p",&stu0, stu0);
        NSLog(@"指针stu1的内存首地址:%p ======= 指针stu1指向对象的内存首地址:%p",&stu1, stu1);
        NSLog(@"指针stu2的内存首地址:%p ======= 指针stu2指向对象的内存首地址:%p",&stu2, stu2);
    }
    return 0;
}

相关文章

  • iOS-浅谈OC中的指针

    将OC代码转换为C/C++代码 打开终端,进入main.m文件所在文件夹下执行以下命令: 但是因为不同平台运行,O...

  • iOS-浅谈OC中isa和superclass的指针指向

    目录 isa指针----isa指针指向superclass指针----class对象的superclass指针--...

  • iOS-浅谈OC中的Block

    KVO简介和基本使用 KVO全称是Key-Value Observing,俗称“键值监听”,可用于监听某个对象属性...

  • iOS-浅谈OC中的Runloop

    LLDB是Xcode自带的调试器,可以通过一些命令获得想要的信息 常用打印 读取内存 修改内存中的值 格式 字节大小

  • iOS-浅谈OC中的KVO

    OC对象的类型 Objective-C中的对象,简称OC对象,主要可以分为3种 instance对象(实例对象)c...

  • iOS-浅谈OC中的KVC

    【一】isa指针 思考消息发送过程 了解Runtime的可能知道,调用方法本质上是消息发送: 思考:实例对象方法保...

  • iOS-浅谈OC中的isa

    目录 isa结构----nonpointer----has_assoc----has_cxx_dtor----sh...

  • iOS-浅谈OC中的Category

    目录 简介基本使用问题思考最终结论Category的底层结构拓展-Category的底层结构Cagegory的加载...

  • iOS 判断NSString NSArray NSDiction

    nil:指向oc中 "对象" 的空指针Nil:指向oc中 "类" 的空指针NULL:指向 "其他类型" 的空指针,...

  • nil,Nil,NULL,NSNull

    nil: OC中对象为空,指向不存在的对象指针 Nil:OC中类为空,指向0的类指针 NULL:C指针为空,在指针...

网友评论

      本文标题:iOS-浅谈OC中的指针

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