iOS-浅谈OC中的指针

2019-04-15  本文已影响0人  晴天ccc

简介

在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,而它所指向的实例对象存储在中。

扩展

        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;
}
上一篇下一篇

猜你喜欢

热点阅读