为什么全局变量的地址已经改变

时间:2018-04-28 07:48:45

标签: ios objective-c

我在person类的.h文件中声明了一个personkey,在Person的单例方法中打印personkey的地址

#import <Foundation/Foundation.h>

static const void*  personKey = &personKey;

@interface Person : NSObject

+(instancetype)sharedPerson;

@end

#import "Person.h"

@implementation Person

static Person *_person;

+ (instancetype)sharedPerson
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [[self alloc] init];
        printf("personkey111 = %p\n",personKey);
    });
    return _person;
}

@end

但是当我在另一个班级打印时,地址已经改变了。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    Person *p = [Person sharedPerson];
    printf("personKey222 = %p,",personKey);
}

这是我的输出

personkey111 = 0x10c70c0e8
personKey222 = 0x10c70c0e0,

2 个答案:

答案 0 :(得分:0)

我改变了我的代码,

static const void*  personKey = "&personKey";

这是我的输出

personkey111 = 0x109ce54c0
personKey222 = 0x109ce54c0,

但我仍然不知道为什么我的第一种方式不起作用

答案 1 :(得分:0)

.h文件中的语句static const void* personKey = &personKey;声明一个独立的const指针,其内存位置为值。导入.h文件时,.h文件只复制前面文件的内容。这意味着您有两个独立的personKey指针包含它们自己的位置。当您声明static const void* personKey = "&personKey";时,两个指针保存字符串"&personKey"的位置,该位置位于静态区域中。