指针变量

IOS 内存管理

我只是一个虾纸丫 提交于 2020-02-04 03:03:11
小议iphone内存管理与属性 一、前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦。 OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存。这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小。 二、基本原理 对象的创建: OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针。 ClassA *a = [[ClassA alloc] init]; 在[ClassA alloc]的时候,已经发送消息通知系统给ClassA的对象分配内存空间,并且返回了指向未初始化的对象的一个指针。 未初始化的ClassA对象接手到init消息,init返回指向已初始化后的ClassA对象的一个指针,然后将其赋值给变量a。 在创建并使用完一个对象的时候,用户需要手动地去释放该对象。 [a dealloc]; 如果指针a和b同时指向堆中同一块内存地址 ClassA *a = [[ClassA alloc] init]; ClassA *b = a; [a dealloc]; 当执行到第三行的时候,指针b就成了无头指针。这是一个在C++中也是常见的错误,我们需要避免这类错误

container_of宏深度解析

走远了吗. 提交于 2020-02-04 01:24:00
作用: 由结构体中某个元素的指针,推出整个结构体变量的指针。 原型: #define container_of(ptr,type,member) {const typeof(((type*)0)->member)* _myptr=(ptr); (type*)((char*)_myptr-offsetof(type,member));}) 变量分析: ptr指向结构体元素member元素的指针;type为结构体类型;member为结构体中的某个元素;typeof为C语言的关键字,用来由变量得到变量的类型,eg;typeof(a)得到变量a的类型。 typeof(((type*)0)->member)* _myptr=(ptr)类似于(int)* p=(ptr)。 宏解析: 先用typeof得到member元素的类型,定义为一个指针( _myptr);然后用这个指针减去该元素相对于结构体首地址的偏移量,就得到整个结构体变量的首地址了,再把这个地址强制类型转换为type*即可(得到指针)。 举例: # include <stdio.h> struct mystruct { char a ; int b ; short c } ; # define container_of(ptr,type,member) { const typeof ( ( ( type * ) 0 ) ->

Runtime之IMP指针,isa指针

余生颓废 提交于 2020-02-04 00:27:32
要了解 isa 指针先了解下类的定义 在xcode中用快捷键Shift+Cmd+O 搜索objc.h 能看到类的定义: 了解 Paste_Image.png 可以看出: objc_object:Objective-C对对象的定义, 其质上是结构体对象,其中 isa是它唯一的私有成员变量,即所有对象都有isa指针 Class 是一个 objc_class 结构类型的指针 id是一个 objc_object 结构类型的指针,这也是id可以指向任何对象的原因 SEL(方法选择器)是一个objc_selector结构类型的指针 IMP 先不提 再搜runtime.h Paste_Image.png 每个对象结构体的首个成员是Class类的变量,该变量定义了对象所属的类,通常称为isa指针 super_class:父类,如果该类已经是最顶层的根类,那么它为NULL。 version:类的版本信息,默认为0 info:供运行期使用的一些位标识。 instance_size:该类的实例变量大小 ivars:成员变量的数组 struct objc_method_list **methodLists OBJC2_UNAVAILABLE : 方法列表,类目就是通过它添加方法的 struct objc_cache *cache OBJC2_UNAVAILABLE : 方法缓存

8.Go语言基础之指针

元气小坏坏 提交于 2020-02-04 00:27:09
Go语言中的指针不能进行偏移和运算,是安全指针。 在了解GO语言中的指针前,首先需要知道三个概念:指针地址、指针类型和指针取值。 1.Go语言中的指针 任何数据载入内存后,在内存中都有对应的地址,这就是指针。 为了保存一个数据在内存中的地址,需要指针变量。 比如"好好学习,天天向上"这个字符串写入程序中,程序一启动这句话就加载到内存(假设内存地址为0x123456),在程序中,把该字符串赋值给变量A,把该字符串的内存地址赋值给变量B。 这时变量B就是一个指针变量。通过变量A和变量B都能找到该字符串。 Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。 也需要记得: 值类型有:int、float、bool、string、array、struct 引用类型有:指针,map,切片,chan 1.1指针地址和指针类型 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。 Go语言中使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int,float,bool,string,array,struct)都有对应的指针类型,如*int,*in64,*string等。 取变量指针的语法如下: ptr := &v // v的类型为T 其中: v:代表被取地址的变量,类型为T ptr

iOS 认识runtime 中的三个指针 isa , IMP , SEL

左心房为你撑大大i 提交于 2020-02-04 00:26:11
runtime中函数调用经常被提及的三个概念 isa,IMP,SEL 一 isa: 是类指针,之所以说 isa 是指针是因为 Class 其实是一个指向 objc_class 结构体的指针,而isa 是它唯一的私有成员变量,即所有对象都有isa指针(isa位置在成员变量第一个位置) //打开 runtime.h文件可看到下面的类的结构体详情内容struct objc_class { Class _Nonnull isa OBJC_ISA_AVAILABILITY;//这个就是上面说的 每个对象都有isa指针 在结构体指针中第一个成员变量的位置上 #if !__OBJC2__ Class _Nullable super_class /*父类*/ const char * _Nonnull name /*类名*/ long version /*版本信息*/ long info /*类信息*/ long instance_size /*实例大小*/ struct objc_ivar_list * _Nullable ivars /*实例参数链表*/ struct objc_method_list * _Nullable * _Nullable methodLists /*方法链表*/ struct objc_cache * _Nonnull cache          /*方法缓存*/

Runtime-iOS运行时基础篇

孤街浪徒 提交于 2020-02-04 00:16:54
转自:https://www.jianshu.com/p/d4b55dae9a0d   本文主要整理了Runtime的相关知识。对于一个iOS开发者来说,掌握Runtime的重要性早已不言而喻。OC能够作为一门优秀的动态特性语言,在其背后默默工作着的就是Runtime。在网上也看过很多资料,最终我还是希望在一些关键的知识点上能够融入自己的理解,从简单的问题出发,一步一步理解和学以致用。 iOS运行时Runtime.png 相关文章:iOS运行时Runtime应用 目录: 一、怎么理解OC是动态语言,Runtime又是什么? 二、理解消息机制的基本原理 三、与Runtime交互的三种方式 四、分析Runtime中的数据结构 五、深入理解Rutime消息发送原理 六、多继承的实现思路:Runtime 七、最后总结 一、怎么理解OC是动态语言,Runtime又是什么? 静态语言 :如C语言,编译阶段就要决定调用哪个函数,如果函数未实现就会编译报错。 动态语言 :如OC语言,编译阶段并不能决定真正调用哪个函数,只要函数声明过即使没有实现也不会报错。 我们常说OC是一门动态语言,就是因为它总是把一些决定性的工作从编译阶段推迟到运行时阶段。OC代码的运行不仅需要编译器,还需要运行时系统(Runtime Sytem)来执行编译后的代码。 Runtime是一套底层纯C语言API

iOS 编码复习(二)—— runtime

半世苍凉 提交于 2020-02-04 00:15:33
最近特意看了很多篇关于runtime的文章。所以自己也想把了解的东西总结一下,以便以后大家一起学习。首先必须要诚实地说一句,这里都是看了别人的文章后,用自己的话总结出来的,而没有像其他额大牛样去用c语言去写一个swizzle method之类的。 首先要说,OC是一门运行时语言,因为它不像c++在编译的时候就会检查所有函数调用,而是运行时才会检查。 先来看看[target dosomething:varl];编译器会把它编译成什么:objc_msgsend(target,@selector(dosomething:),varl);你会发现这是一个c方法。那什么是runtime呢?runtime其实就是一个运势时的c语言写成的基础库,oc的程序必须得到runtime的的运行才能正常work。 下面我们来介绍一下对象和类。它们其实就是用c语言封装的结构体。(感受下面向对象与面向过程语言的区别) oc里的class实际上就是一个 objc_class 结构体的指针: typedef struct objc_class *Class; struct objc_class { Class isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; // 父类 const char *name

《c++primer》笔记 第3章 字符串、向量和数组

廉价感情. 提交于 2020-02-03 09:52:04
标准库类型 本章重要的两个: string 和 vector ,以及配套的迭代器。 3.1 命名空间的using声明 using声明具有如下的形式: using namespace::name; 一旦声明了上述语句,就可以直接访问命名空间中的名字: #include<iostream> //using声明,当我们使用名字cin时,从命名空间std中获取它 using std::cin; int main() { int i; cin >> i;//正确:cin和std::cin含义相同 cout << i;//错误:没有对应的using声明,必须使用完整的名字 std::cout << i;//正确:显式地从std中使用cout return 0; } 用下面的using可以使用std里面的所有名字: using namespace std; 头文件不应包含using声明 3.2 标准库类型string 初始化string对象的方式 string s1; //默认初始化,si是一个空串 string s2(s1); //s2是s1的副本 string s2=s1; //等价于s2(sl>,s2是s1的副本 string s3("value"); //S3是字面值"value"的副本,除了字面值最后的那个空字符外 string s3="value"; //等价于s3("value")

C++引用与指针(一):引用

北城余情 提交于 2020-02-03 03:52:30
1. 引用基本概念及说明 引用 就是为已有的对象a所起的另外一个名字b,可以通过引用去修改b以实现对象a的修改。 引用格式: 类型说明符 &引用名=变量名 例程: int i; int &ri=i; i=5; cout<<i<<endl; ri=10; cout<<ri<<endl; &不是C语言中的取地址运算,而是标识符 类型说明符必须和目标变量类型一致 说明 : 引用在声明时必须初始化 一个实体可以有多个引用,但是一个引用只能引用一个实体 引用即别名,相当于目标对象有一个原名和别名,引用不是对象,所以也无法作为另外一个引用的原名。 不能建立数组的引用 2. 引用的实际应用 2.1 引用作为参数 还记得在C语言中,如果要对函数传入可以在函数内部修改,且修改有效的变量时,我们需要使用传入指针。而C++中,引用提供了传入可修改变量的一种方法,见例子 //p1,p2均为引用 void swap(int& p1, int& p2) { int p; p = p1; p1 = p2; p2 = p; } int main() { int a = 1, b = 2; cout << "交换前,a和b" << " " << a << " and " << b << endl; swap(a, b); cout << "交换后,a和b" << " " << a << " and " << b <

c++学习笔记2(const关键词的用法)

萝らか妹 提交于 2020-02-02 23:52:06
定义常量指针 优势(便于类型检查,define无类型检查(目前不是很理解)) (函数参数为常量指针时,可避免函数内部不小心改变参数指针所指的地方,如有出现此类语句,编译则会报错) strcpy:复制字符串 注1:不可通过修改常量指针修改其指向对象 注2:不能把常量指针赋值给非常量指针,反之可以(常量指针指向的内容倾向于尽量不要修改,如此赋值的话,可以通过修改非常量指针的值去修改常量指针指向的内容,存在不安全因素) 注3:如果想要用非常量指针指向常量指针,可通过强制类型转换实现例如const int 类型,赋值时刻可以使yy=(int )xx 注4:不能通过修改常引用修改其引用变量 来源: https://www.cnblogs.com/lamia76/p/12253976.html