下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】iOS如何获取属性
这篇文章主要介绍了iOS如何获取属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。指针如果说到内存,不知道大家会不会想到**指针**呢?这里简单介绍一下,让大家有个简单的理解。如果理解不了的话,建议大家找一个C语言的教程,学一下指针。指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。*那到底什么是指针呢??
类型*变量名这就是声明了一个指针变量
指针类型有什么作用呢?比如:int*
num;指针变量的类型决定了通过这个指针找到变量的首地址以后,连续操作多少个字节空间为什么会说连续操作多少个字节空间??主要是指针有算术运算加减,说白了就是指针的移动。指针是int*连续操作4个字节指针是double*连续操作8个字节比如int*
p
=
#
p++;当指针+1的时候,这时候指针要移动1个单元,而不是1个字节!!那到底这1个单元是多大呢?其实1个单元的大小就是指针类型的大小。这里是`int`型,所以移动了4个字节以上就是简单给大家做了**指针**介绍,其实理解了指针,对于我们出现的一些野指针的bug、runtime源码中的一些机制等等是有所帮助的。言归正传。接下来让我看一道题,真正的去了解内存和指针的关系。int
num1
=
10;
int
num
=
20;
int*
p
=
#
p++;
printf("%d
",*p);//打印为10,因为p++,指针已经移动了4个字节,下一个内存存储10正好是4个字节这里其实是前边声明了一个num1,正好是4个字节,所以就将10取出来了。(说白了就是内存中下一个连续的4个字节存的是什么取出来就是什么)说了这么多都是指针和内存,建议大家搞明白以上内容再读以下的内容,如果上边都搞不明白的话,下边有关iOS中runtime取属性的内容有可能就会云里雾里。iOS中成员变量与属性以下题目是sunnyxx习题中的一题,网上也有详细的[答案](/shznt/article/details/50481819)。这里作者就简述一下自己的理解,如果想看非常详细的答案的话可以点击上边的链接。下面代码会?CompileError/RuntimeCrash/NSLog…?@interface
Sark
:
NSObject
@property
(nonatomic,
copy)
NSString
*name;
@end
@implementation
Sark
-
(void)speak
{
NSLog(@"my
name
is
%@",
);
}
@end
@interface
Test
:
NSObject
@end
@implementation
Test
-
(instancetype)init
{
self
=
[super
init];
if
(self)
{
id
cls
=
[Sark
class];
void
*obj
=
&cls;
[(__bridge
id)obj
speak];
}
return
self;
}
@end
int
main(int
argc,
const
char
*
argv[])
{
@autoreleasepool
{
[[Test
alloc]
init];
}
return
0;
}答案:代码正常输出,输出结果为:2014-11-0714:08:25.698Test[1097:57255]mynameis
为什么能够正常运行,并调用到speak方法?计算机将我们的`Sark`类信息通过`idcls=[Sarkclass];`这一行加载到内存中,并且取得了`cls`变量。这个时候其实我们只要知道`cls`这个变量的地址就行了,其实相当于类的对象的地址。`void*obj=&cls;`这句话就让我们获得了对象的地址。(平时我们`new`对象的时候就干了两件事:1、申请内存;2、获取内存的地址(对象变量的地址就是内存的地址),这里的对象与我们`new`出来的对象有所不同。但是虽然不是new对象,iOS中`Class`对象已经存储了我们需要的东西。比如有关变量的内存**偏移**、方法等等所有的信息)接下来可以干我们想干的任何事情了。>iOS中`Class`中存储了我们想要的东西,这一块的知识要上升到了runtime的源码,上边给到的链接中有详细介绍。其实大家想想编译完之后肯定得有一个类或者其他东西存储着有关内存等等相关的信息的。为什么会输出?我们程序在编译之后其实就是一堆的汇编指令,汇编操作的就是**内存地址**。所以当我们程序运行的时候都是**寄存器**一条条的执行汇编指令。其实执行汇编指令最重要的就是变量、方法、对象等等的一大堆地址,因为寄存器有限,所以会把有限的数据从内存中加载到寄存器。所以总得来说是操作寄存器的地址和内存地址。如果没有地址那怎么知道执行什么呢?所以只要有地址了就好办了。指令如下图:变量对应于runtime的objc_ivar代码如下:struct
objc_ivar
{
char
*ivar_name
OBJC2_UNAVAILABLE;
char
*ivar_type
OBJC2_UNAVAILABLE;
int
ivar_offset
OBJC2_UNAVAILABLE;
#ifdef
__LP64__
int
space
OBJC2_UNAVAILABLE;
#endif
}其中`ivar_offset`就是变量的地址偏移字节。变量地址=对象地址+基类大小+ivar偏移字节到这里再结合我上边指针的铺垫相信大家应该明白了为什么为什会输出吧。其实通过这里我们也知道了其实iOS中取对象就是指针的偏移。Student
*student
=
[[Student
alloc]
init];
Ivar
age_ivar
=
class_getInstanceVariable(object_getClass(student),
"age");
int
*age_pointer
=
(int
*)((__bridge
void
*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宣传干事面试题及答案解析
- 2023年梅州市遴选公务员考试真题汇编含答案解析(夺冠)
- 2022中国铁路北京局集团有限公司招聘普通高校毕业生123人(四)(公共基础知识)测试题附答案解析
- 2026年一级造价师考试题库300道及答案【夺冠系列】
- 2026年高校教师资格证《高校教师职业道德》题库及答案(各地真题)
- 2024年包头市选调公务员考试真题汇编及答案解析(夺冠)
- 2026年厦门港务公司安全生产部门考试题含答案
- 2026年心理咨询师之心理咨询师二级技能考试题库及答案【夺冠】
- 2024年遵义市直属机关遴选公务员考试真题汇编附答案解析(夺冠)
- 2026年新闻中心团队成员的考核与评价标准
- 贾玲春晚搞笑公司年会小品《真假老师》台词剧本完整版
- 医院门诊病历本
- 涉诈风险账户审查表
- 测绘资质分级标准规定(2014版)
- 家谱序言经典范文(12篇)
- 学习弘扬枫桥精神与枫桥经验PPT枫桥经验蕴含的精神和内涵PPT课件(带内容)
- GB/T 16251-1996工作系统设计的人类工效学原则
- GA/T 1556-2019道路交通执法人体血液采集技术规范
- 以此为主GS-操作手册(中文简体) 含精度检验表200807
- 循证护理问题的提出
- DB32T 4024-2021 农村生活污水处理设施物联网管理技术规范
评论
0/150
提交评论