我在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,
答案 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"
的位置,该位置位于静态区域中。