文档章节

Ivar/property详解

xiaobai1315
 xiaobai1315
发布于 2017/05/05 11:12
字数 866
阅读 10
收藏 0
点赞 0
评论 0

1.Ivar

1.1Ivar 的类型

typedef objc_ivar * Ivar;

  struct objc_ivar {
     char *ivar_name;
     char *ivar_type;
     int ivar_offset;
  #ifdef __LP64__
     int space;
  #endif
  }

Ivarobjc_ivar的指针,包含变量名,变量类型等成员。

1.2为类添加 Ivar

运行时规定,只能在objc_allocateClassPairobjc_registerClassPair两个函数之间为类添加变量

如下所示:

  //额外空间     未知,通常设置为 0
  Class clazz = objc_allocateClassPair(父类class,类名,额外空间);
  //以NSString*为例
  //变量size sizeof(NSString)
  //对齐     指针类型的为log2(sizeof(NSString*))
  //类型     @encode(NSString*)
  BOOL flag = class_addIvar(clazz,变量名,变量size,对齐,类型);
  objc_registerClassPair(clazz);

1.3 Ivar的相关操作

  //获取Ivar的名称
  const char *ivar_getName(Ivar v);
  //获取Ivar的类型编码,
  const char *ivar_getTypeEncoding(Ivar v)
  //通过变量名称获取类中的实例成员变量
  Ivar class_getInstanceVariable(Class cls, const char *name)
  //通过变量名称获取类中的类成员变量
  Ivar class_getClassVariable(Class cls, const char *name)
  //获取指定类的Ivar列表及Ivar个数
  Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
  //获取实例对象中Ivar的值
  id object_getIvar(id obj, Ivar ivar) 
  //设置实例对象中Ivar的值
  void object_setIvar(id obj, Ivar ivar, id value)

1.4 Ivar的使用

  //在运行时创建继承自NSObject的People类
  Class People = objc_allocateClassPair([NSObject class], "People", 0);
  //添加_name成员变量
  BOOL flag1 = class_addIvar(People, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
  if (flag1) {
      NSLog(@"NSString*类型  _name变量添加成功");
  }
  //添加_age成员变量
  BOOL flag2 = class_addIvar(People, "_age", sizeof(int), sizeof(int), @encode(int));
  if (flag2) {
      NSLog(@"int类型 _age变量添加成功");
  }
  //完成People类的创建
  objc_registerClassPair(People);
  unsigned int varCount;
  //拷贝People类中的成员变量列表
  Ivar * varList = class_copyIvarList(People, &varCount);
  for (int i = 0; i<varCount; i++) {
      NSLog(@"%s",ivar_getName(varList[i]));
  }
  //释放varList
  free(varList);
  //创建People对象p1
  id p1 = [[People alloc]init];
  //从类中获取成员变量Ivar
  Ivar nameIvar = class_getInstanceVariable(People, "_name");
  Ivar ageIvar = class_getInstanceVariable(People, "_age");
  //为p1的成员变量赋值
  object_setIvar(p1, nameIvar, @"张三");
  object_setIvar(p1, ageIvar, @33);
  //获取p1成员变量的值
  NSLog(@"%@",object_getIvar(p1, nameIvar));
  NSLog(@"%@",object_getIvar(p1, ageIvar));

2. Property

2.1 objc_property_t 与 objc_property_attribute_t类型

typedef struct objc_property *objc_property_t;

  //特性
  typedef struct {
      const char *name;           //特性名称
      const char *value;          //特性的值
  } objc_property_attribute_t;

特性相关编码
属性的特性字符串 以 T@encode(type) 开头, 以 V实例变量名称 结尾,中间以特性编码填充,通过property_getAttributes即可查看

特性编码 具体含义
R readonly
C copy
& retain
N nonatomic
G(name) getter=(name)
S(name) setter=(name)
D @dynamic
W weak
P 用于垃圾回收机制

2.2 为类添加Property

  BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)

2.3 Property的相关操作

  //替换类中的属性
  void class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
  //获取类中的属性
  objc_property_t class_getProperty(Class cls, const char *name)
  //拷贝类中的属性列表
  objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
  //获取属性名称
  const char *property_getName(objc_property_t property)
  //获取属性的特性
  const char *property_getAttributes(objc_property_t property) 
  //拷贝属性的特性列表
  objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount)
  //拷贝属性的特性的值
  char *property_copyAttributeValue(objc_property_t property, const char *attributeName)

2.4 Property的使用

  Class People = objc_allocateClassPair([NSObject class], "People", 0);
  objc_registerClassPair(People);
  //T@
  objc_property_attribute_t attribute1;
  attribute1.name = "T";
  attribute1.value=@encode(NSString*);
  //Noatomic
  objc_property_attribute_t attribute2 = {"N",""};//value无意义时通常设置为空
  //Copy
  objc_property_attribute_t attribute3 = {"C",""};
  //V_属性名
  objc_property_attribute_t attribute4 = {"V","_name"};
  //特性数组
  objc_property_attribute_t attributes[] ={attribute1,attribute2,attribute3,attribute4};
  //向People类中添加名为name的属性,属性的4个特性包含在attributes中
  class_addProperty(People, "name", attributes, 4);
  //获取类中的属性列表
  unsigned int propertyCount;
  objc_property_t * properties = class_copyPropertyList(People, &propertyCount);
  for (int i = 0; i<propertyCount; i++) {
      NSLog(@"属性的名称为 : %s",property_getName(properties[i]));
      NSLog(@"属性的特性字符串为: %s",property_getAttributes(properties[i]));
  }
  //释放属性列表数组
  free(properties);

本文转载自:http://www.jianshu.com/p/ead476cdb828

共有 人打赏支持
xiaobai1315
粉丝 3
博文 194
码字总数 80097
作品 0
程序员
【Objective-C】iOS开发中常见的语句@synthesize obj=_obj的意义详解

在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则会得到类似下面的编译错误: Synthesized property...

iNiL0119
2014/02/27
0
0
IOS,objective_C中用@interface和 @property 方式声明变量的区别

转自http://www.cnblogs.com/letmefly/archive/2012/07/20/2601338.html 一直有疑问,在objective_C中声明变量会有 2种方式,今天有空和网友讨论了下,并且自己查了stackoverflew后算是稍微弄...

AAAAdler
2012/12/28
0
0
ios5 编程关于@synthesize window = _window的理解

@synthesize window=_window;@synthesize viewController=_viewController; 通常看到的都没有包含=部分,@synthesize window=window; 怎么理解?这里的 window 和 _viewController 是什么变量......

mjrao
2012/07/08
0
0
使用运行时来获得公有属性和私有属性的方法

运行时:<objc/runtime.h> 方法的调换: Method m1 = class_getClassMethod([UIImage class], @selector(imageWithName:)); Method m2 = class_getClassMethod([UIImage class], @selector(......

奋斗的青春年华
2016/07/15
12
0
Objective-C的属性和成员变量用法及关系浅析

在使用Objective-C语言进行了一段时间的iOS开发之后,发现自己的语言基础相对薄弱,于是开始弥补自己的短处。我发现在用过一种语言之后,再回过头来看它的很多原理会发现有更加深刻的理解。下...

北方人在上海
2015/10/30
0
0
记录一下iOS开发中琐碎的点点_3

UIWindow 正常情况下, 一个应用中只有一个UIWindow对象, 但是实际上iOS应用是支持多个UIWindow对象的. UIWindow的作用: 作为容器,包含app所要显示的所有视图 传递触摸消息到程序中view和其他...

hell03W
2016/04/26
43
0
为何百兆静态库能打进数兆的可执行文件?

前言 第三方库是工程开发必不可少的部分,而第三方库可以是.a和.framework的静态库,也可以是.framework的动态库,其中静态库是最常用的方式。 静态库往往比较大,可在打包到可执行文件之后,...

落影loyinglin
04/25
0
0
Objective-C Runtime 运行时之二:成员变量与属性

在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现。 本章的主要内容将聚集在...

hejunbinlan
2016/06/03
8
0
Objective-C Runtime:深入理解成员变量与属性

樱花盛开.jpg 概述 在上篇文章Objective-C Runtime:深入理解类与对象中,讲解了类与对象的相关内容。 在本文中,着重讲解一下类实现细节的先关内容,主要包括类中的成员变量、属性、方法以及...

Jack_lin
03/29
0
0
Objective-C底层数据结构

类的数据结构 Class(指针) typedef struct objc_class Class; / 这是由编译器为每个类产生的数据结构,这个结构定义了一个类.这个结构是通过编译器在执行时产生,在运行时发送消息时使用.因此,...

Michael-W
2014/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统

expect脚本同步文件 更改权限 执行脚本 查看执行结果 expect eof需要加上,作用是等脚本命令执行完再进行退出 expect脚本指定host和要同步的文件 更改权限,执行脚本 构建文件分发系统 需求背...

Zhouliang6
24分钟前
1
0
Hive应用:外部分区表

Hive应用:外部分区表 介绍 Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示...

星汉
34分钟前
0
0
点击Enter登录

1. 效果 2. 实现过程(记得引入jq文件) //6.回车事件 登录 $(function() { document.onkeydown = function(event) { var e = event || window.event || arguments.callee.caller.arguments......

Lucky_Me
39分钟前
1
0
点击菜单内容切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .mao{ ......

南桥北木
今天
1
0
OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
今天
508
6
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
7
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
1
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
13
0
idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
2
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部