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
,而它所指向的实例对象
存储在堆
中。
-
知识补充: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指针变量
在内存中存储的内容。使得stu
和stu2
的指针指向地址相同。
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;
}