почему адрес глобальной переменной изменился - PullRequest
0 голосов
/ 28 апреля 2018

Я объявляю персональный ключ в файле .h в классе person. , Напечатать адрес персонального ключа в методе singleton-файла Person

#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 голосов
/ 28 апреля 2018

Оператор static const void* personKey = &personKey; в файле .h объявляет независимый указатель const с позицией в памяти в качестве значения. При импорте файла .h, файл .h просто копирует содержимое предыдущего файла. Это означает, что у вас есть два независимых указателя personKey, содержащих свои собственные местоположения. Когда вы указываете static const void* personKey = "&personKey";, два указателя содержат местоположение строки "&personKey", которая находится в статической зоне.

0 голосов
/ 28 апреля 2018

Я изменил свой код следующим образом,

static const void*  personKey = "&personKey";

вот мой вывод

personkey111 = 0x109ce54c0
personKey222 = 0x109ce54c0,

Но я до сих пор не знаю, почему мой первый способ не сработал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...