问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ios instance variable xxxx'accessed in class method 怎么解决

发布网友 发布时间:2022-04-25 16:41

我来回答

1个回答

热心网友 时间:2023-10-19 06:55

首先我们来看一下c语言中的struct的内存表示:
typedef struct intStruct
{
int i;
}intStruct;
结构体在内存中的表示为:
00 00 00 0A
如果我们简单的定义一个int并赋值,这个int在内存中的表示为:
int i = 10;
00 00 00 0A
结构体和int在内存中的表示是一样的!
如果我们定义的结构体更为复杂,有多个变量,那么它们在内存中是依次排列的(不考虑大端小端的情况)。在内存中排列一致,导致intStruct和int可以相互转换。
当你在看apple开发文档时发现toll-free bridged这种字眼时(经常发生在NS***和CF***之间),表明它们是可以相互转换的,因为它们在内存中的排列是一致的。例如NSarray和CFArrayRef(NS为cocoa,CF为core foundation)
CFArrayRef arrayRef = //some value;
NSArray *array = (NSArray*)arratRef;
我们回头再看NSObject的定义,理解下为什么objective-c称之为objective-c.
@interface NSObject{
Class isa;
}
@interface关键字告诉编译器:请将NSObject作为objective-c的一个类名,并将它转换成一个struct:
struct NSObject{
Class isa;
};
看到了吧,所有的object都是c的结构体。
我们再来看下Class的定义:
typedef struct obj_class *Class;
struct obj_class{
Class isa
Class super_class
const char *name
long version
long info
long instance_size
struct objc_ivar_list *ivars
struct objc_method_list **methodLists
struct objc_cache *cache
struct objc_protocol_list *protocols
}
objc_class包含了objc类所需的所有信息,例如变量列表,方法列表,满足的protocol等等。这些信息可以通过gdb将感兴趣的信息打印出来.
我们注意到,NSobject和objc_class都有一个isa变量,NSObject的isa描述它的元信息(即object的类信息),objc_class描述类的类信息(即类的元信息)。这样,同object一样,class也是一种object,它在obj_class的isa中可以记录class method(用 + 声明的方法)。
Objc中的runtime reflection就是根据这信息操作的。
方法:
当你在为object定义方法时,例如:
@implementation MyClass
- (void)someMethod:(NSString*)param
@end
编译器会相应的转换为:
void [-someMethod:](id self, SEL _cmd, NSString *param){}
_cmd为方法的调用方(receiver), _cmd为方法签名(跟你用@selector得到的一样),后续为方法需要的参数。
当你调用方法时,objective-c会将方法调用都会转成c的方法调用。例如当你在程序里写如下语句时:
[myClass someMethod:@"bytedance"]
会相应的转换为:
objc_msgSend(myClass, @selector(someMethod:), @"bytedance")
@selector本质是一个c string,唯一与c string不同的是在整个内存空间中,同一方法签名的@selector的内存地址是相同的,这样在比较方法签名时候不需要采用同strcmp这么耗时的操作,而通过比较@selector的内存地址即可。
如果调用方没有找到相应的方法,会调用 [NSObject resolveInstanceMethod]方法给调用方一次处理的机会
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何用易语言实现QQ登录器的QQ号空了就出现“QQ号为空,请输入QQ号... 介绍几首最新的网络歌手唱得网络红歌呗。。谢谢啊 求推荐几首好听的歌,要和徐良风格差不多的 ...男女合唱的】最好多推荐几首,试到一首好听的 有什么蛮好听的新歌吗?网络歌手、非主流的,像汪苏泷、徐良、阿悄他们的... 关于Guitar Rig 4的两个问题,求解答。。。 右脚跟疼是什么原因引起的 男人右脚后跟筋疼的原因 右脚跟痛 我右脚跟腱痛怎么治呀,两个多月前崴了一下,找人捏了几次,但现在跟腱一... 交话费没有短信通知 数字钟vhdl程序代码源 为什么充值后没有收到短信提醒? PHP的T_VARIABLE' or `'$''错误是什么意思? 为什么我的手机充了话费没有信息提示,每次充完都要确认一下,好麻烦... 安装 ecshop后报错 Strict standards: Only variables should be passed by reference in 为什么我手机充了话费 没有信息提示? 如何在VC中WININET使用HTTP的POSTA和GET方法 在VB中的Variable函数中声明的自己定义的类为类型为什么不可用?急用!谢了! VHDL语言中with-select-when语句能对变量variable赋值吗? 一个VC 编辑框换行的小问题 AE中如何保存文件的问题 AE视频都篇好了然后怎么保存起来啊谁知道的告诉下谢谢 我用AE抠完图怎么保存 ae怎么保存视频 AE如何保存文件 ae怎么保存到桌面 Ae完成作品怎么保存发送 深圳发布公积金新规:其他住房消费提取须在深有房 课题研究,关于饮水与健康的课题总结,500字左右,你们能提供多少算多少,必有重谢。 充了话费为什么没有短信通知? 为什么我交完话费没有短信提示 刚刚用微信交的话费,为什么没有短信提示? 怎么每次交话费都没有短信提醒? 为什么联通充值完话费没有短信提示? 今天充了话费,没有短信提示,但钱扣去怎么办 交了话费为什么没有短信 行李箱的尺寸如何算?比如24寸,那是多,厚,长,宽 为什么充话费没有信息提示? 德国留学的行李问题!!! 有什么程序可以让手机定时放歌。并且可以设几个时间段 宽42厚24长57的行李箱多大 有没有哪个手机音乐软件,是可以设定时间,到点可以自动播放的?比如 行李箱宽43,厚32,高73飞机能不能托运? 长54宽37厚23.5是多少寸箱子。总容量35L。重3.5KG。能进飞机吗。 出国留学要带几个行李箱?? 行李箱长53cm宽34cm厚24cm上飞机还用空运吗 有没有可以定时播放音乐的手机软件,像闹钟一样可以定时播放。 去西班牙留学一年行李物品清单 有没有可以设置定时播放的音乐播放器?