一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造成内存泄露 全局区:所有的全局变量和静态变量 常量区:所有的常量 代码区:程序编译后的指令集 类是模板,肯定需要存在内存里面,因为实例化对象的时候需要根据这个模板来创建,那么存在内存里面,存在哪呢?? 类模板存在:全局区! 存的是:类的描述,还有所有的方法实现 每个对象都会有一个系统给我们的isa指…
  一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) { //main函数 @autoreleasepool {//自动释放池,我们现在写代码最好都写这里面 NSLog(@"Hello, World!"); //输出语句 } ; //退出程序,返回一个值给系统看 } 二.OC中的字符串 /* 前缀的概念:(了解一下) 提供框架的作者很多,所以…
一.点语法介绍 /* 以前封装后,要给属性赋值,必须调用方法 这样做,有两个缺点: 1.代码量多,调用方法要写的东西多. 2.看起来并不像是给属性赋值,也不像取值. 我们用点语法就可以更好的解决! 点语法的语法: 对象.属性; 注意:这里的属性不需要加_ 对象.属性 = 值; 点语法的本质: 其实就是调用getter或者setter方法. 点语法注意事项: 1.在类的方法里面如果用self.age 这个是调用方法,self->_age 是直接调用成员变量. 2.千万记得不要在setter或者ge…
一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类的方法,绝对不是再写一个自己类的方法. 代码中原话叫:子类重写父类方法. 因为父类定义的方法不一定适用于子类. 注意:如果有重写,那么调用的是自己重写后的方法,如果没有重写,那么就调用的是父类的方法. 所以我们方法有一个执行的过程: 1.先去自己类里面找这个方法,如果找到就执行. 2.如果没找到,就…
一.类方法的使用 /* 像我们之前学的方法,必须先实例化这个类的对象才能调用这个方法,类方法不用实例化对象,直接调用这个方法. 之前学的方法调用的语法: [对象名 方法名]; //对象方法 类方法: [类名 方法名]; //类方法 定义: 语法:+(返回值类型)方法名:参数列表; 注意: 1.类方法不能直接访问成员变量. 2.类方法里面可以调用其他的类方法,但不能直接调用对象方法. 3.对象方法里面可以调用类方法. 4.类方法可以和对象方法同名,互不影响.因为类方法用类名调用,对象方法用对象名调…
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例如:int num =0; csanf("%d",&num);printf("num = %d \n",num); 注意:格式化控制符前面要求输入什么类型的数据,那么地址列表那里就必须只能放相应类型变量地址.输入值的时候可以指定输入值的分隔符, 也可以 默认用回…
上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的位数用空格表示 如果实际的整数位数大于或者等于m时,就按照原先的值输出. 2.%0md:作用和%md一样,只是实际数字不足的位数用0表示.注意不能用其他的符号补齐,只能用0.   %f或者%lf 1.float类型数字有效数字是小数点后6位(加小数点为7位),double类型的数字有效数字为14位(…
本节主要说关系运算式和逻辑运算式. 一.关系运算式 1.等于(==):判断左边的表达式是否等于右边的表达式 2.大于(>):判断左边的表达式是否大于右边的表达式 3.大于等于(>=):判断左边的表达式是否大于等于右边的表达式 4.小于(<):判断左边的表达式是否小于右边的表达式 5.小于等于(<=):判断左边的表达式是否小于等于右边的表达式 6.不等于(!=):判断左边的表达式是否不等于右边的表达式 //注意:c语言中,关系运算所得结果只有0和1,0代表false(假),1代表tr…
一.函数的指针的介绍 /* 函数指针: 函数的指针,本质上一个指针 指向函数的指针,就是一个函数指针. 回忆:我们写的源代码编译成二进制的指令集,一串交给CPU执行的指令 先存在内存里面,然后CPU读取内存里的指令,既然存到内存里面,一定有一个地址 所以,我们可以定义一个指针变量保存函数的地址,那么这样的指针变量就是函数指针. 函数指针定义语法: 返回值类型 (*指针变量)(参数列表); 例: void (*pTest)(); //变量名:pTest 这个指针指向的是无返回值无参数的函数类型.…
一.指针的加.减法运算 /* 1.加法运算 1).可以跟整数进行加法运算,得到的还是一个地址 公式: 地址 + 1 = 地址 + 1 * 类型所占的字节数 地址 + n = 地址 + n * 类型所占的字节数 2).只能跟整数运算,不能跟浮点数运算 2.指针的减法运算: 1).可以跟整数进行减法运算,得到的还是一个地址 公式: 地址 - 1 = 地址 - 1 * 类型所占的字节数 地址 - n = 地址 - n * 类型所占的字节数 2).只能跟整数运算,不能跟浮点数运算 */ //例如: //…
本节主要介绍c语言中的字符串的应用. 一:字符串介绍 因为c语言中没有像Java.C#那样的字符串类型,所以无法直接用字符串.需要借助数组来解决这个问题. /* 定义:把多个字符连在一起就叫字符串.但是在c语言中要正确描述字符串,需要说成以'\0'结尾的字符集合. 用数组解决字符串问题: 1.长度需要 +1. 2.在末尾加一个'\0' 然后用%s输出. 例如: char chs[4] = {'a','b','b','\0'}; printf("%s \n",chs); 语法: 1.ch…
本节主要介绍循环结构 一.while循环 /* 语法: while(表达式){ //循环体; } 注意:循环变量.循环条件和循环控制语句三者缺一不可. 例如: */ ; //循环变量 ){ //循环条件 printf(" %d",num): num++; //控制循环结束语句 } //例如:计算1到100的和 ; ; ){ sum+=i; i++; } printf("sum= %d",sum); /** 注意: 1.避免死循环,避免永真或永假.永真死循环,永假不执…
本节主要介绍c语言中运算符. 运算符主要分为四类: 1.算术运算符 加(+),减(-),乘(*),除(/),取余(%,两数相除,得到余数) 2.关系运算符 3.逻辑运算符 4.换位运算符 下面将依次介绍运算符. 1.算术运算符: //加(+):让两个操作数相加得到它们的和. //例如: ; ; //int sum = num+num1;printf("num+num1=%d \n",sum ); printf("num+num1=%d \n",num+num1);…
本系列是为了学习ios做准备的,也能作为c语言入门的教程看看. c语言的程序结构: 1.顺序结构:自上而下依次执行. 2.分支结构:程序有选择的执行某段代码或者不执行某段代码. 3.循环结构:程序循环的去执行某段代码. c语言的代码块: 定义:每个{}就是一个代码块. 注意:{}代码块中定义的变量,代码块外不可以访问.原因:除了代码块之后,代码块内部定义的变量就会被回收. 代码块中可以定义代码块外中已存在的变量. //代码块 ; { //就近原则 ; printf("num = %d"…
一.预处理指令的介绍 预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令. 特点:以#开头,不要加分号. #include: 文件包含指令 把指定文件的内容复制到相应的位置 #define: #define 宏名 替换的值; 宏.宏定义或者还叫宏代换. 作用:就是在编译之前把所有用到这个宏的地方,替换成你指定的东西 规范:宏名大写,可以跟变量区分开来 之前学的宏: INT32_MAX INT32_MIN 宏不占据内存空间,只是帮你做简单的替换. 注意: 1.宏只是简单的替换,不参与编译…
一.枚举的介绍 /* 枚举:限制的待选项. 语法: enum 枚举名{ 选项1, 选项2, 选项3, ........ 选项n }; 注意:枚举中,选项之间用 , 隔开,最后一个不用加 , :并且枚举已 ; 结尾. 声明枚举变量: enum 枚举名 变量名 ; 例如:enum qHand qh; 赋值: 1.先声明,后赋值 enum 枚举名 变量名 ; 变量名 = 枚举项; 例如: enum qHand qh; //qh是变量名,enum qHand 是类型 qh = 石头; 2.声明的时候初始…
本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. char score[5];//定义了一个char 类型的数组,长度为5,可以保存5个数据. 访问数组中的元素: 取值:数组名[编号]; 赋值: 数组名[编号] = 值; 元素:数组中实际存放的一个个数据. 下标/索引:系统自动分配的编号,从0开始. 长度:数组实际保存元素的个数. */ //例如…
本节主要说c语言中的分支结构. c语言中分支结构有两大类:一种是if,一种是switch. 一.if结构 //if结构,语法: //第一种: if(表达式){ //语句块 } //第二种: if(表达式){ //语句块 }else{ //语句块 } //第三种: if(表达式){ //语句块 if(表达式){ //语句块 }else{ //语句块 } }else{ //语句块 } //第四种 if(表达式){ //语句块 }else if(表达式1){ //语句块1 }else{ //语句块2…
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类型. 因为类型不能保存数据,所以我们要有结构体变量. 语法: struct 结构体名 变量名; 变量赋值的语法: 变量名.成员名 = 数据; 例: zs.age = 16; 输出结构体: 注意:没有任何格式化控制符能够一次性输出整个结构体 我们必须一个成员一个成员的输出 结构体:可以用来保存多个不同…
一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址,而记住首地址就行了(因为首地址相当于入口或者生活中的门) 指针: 指针就是地址,地址就是指针. 地址:内存的地址 内存中的地址: 其实也是从1开始编号,然后一直自增 1M内存,1024个地址 0x7fff5fbff7cc:这叫16进制 十进制:逢10进1 有:0 1 2 3 4 5 6 7 8 9…
一:预处理指令 /* 预处理指令: 作用:在程序编译之前做一些操作. 预处理命令写法的共同特点:都是以#号开头. 文件包含指令:#include 是一个文件包含命令. 作用:把某个文件内的内容读取出来放到相应的位置. 和文件格式无关.它都会读取这个文件内的内容. 注意: 1. 如果不知道文件的路径,可以把文件直接拖进xcode就有路径了. 2.文件中的内容一定要遵守C语言的规范. 3.末尾不要加分号. #include有<>和" "之分: <>和" &…
本节开始说函数. 一.函数的基本用法  /* 作用:可以实现代码的复用,在一定程度上解决代码冗余的问题:方便后期维护. 语法: void 函数名(){ 函数体; } 函数命名要有意义,遵守驼峰命名法.起名要有意义,要做到看到函数名就知道函数体有什么作用. */ //例如: void printfMsg(){ printf("哈哈哈哈."); } int main(int argc,const char * argv[]){ printfMsg(); ; } 二.带参数的函数 /* 带一…
一.malloc函数 /* 首先需要导入头文件 #include <stdlib.h> malloc void* malloc(n); n是字节大小 开辟堆空间,开辟的字节数以n为准 返回的是开辟空间的首地址 void*是万能指针,也就是说你可以用任意类型的指针去指向 */ //malloc用法 int *p = malloc(sizeof(int)); *p = ; printf("%p %d\n",p,*p);//0x100105490 ); pc[]= 'a'; pc…
一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变量. static: 修饰局部变量:      可以把局部变量变为静态变量.意思就是:程序一启动就加载,程序退出才会回收空间(跟全局变量很像) .   静态变量:用static修饰的局部变量就叫静态变量. 修饰全局变量:            让全局变量只能在本模块中访问.     修饰函数:   …
一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) { // int num = 20; // fwrite(&num, sizeof(num), 1, fp);//写入int Person p = {}; //int num = 20; fwrite(&p, , fp); printf("写完了\n"); fclose(f…
一.文件的分类 1.文本文件:打开之后能看得懂的文件 2.二进制文件:打开之后看不懂,类似乱码之类的文件(视频,音频打开之后,能看.听,是应为电脑中装有播放器,播放器中含有解码器). 二.操作文件的步骤和方式 操作步骤: 1.打开文件 2.操作文件 3.关闭文件 操作方式: 文件流:操作文件就像水流一样,将一个大的文件分成一段一段的流过去. 好处:分段操作,避免出现阻塞,卡死的发生. 三.操作文件的函数 1.fopen函数: /* fopen函数: fopen(路径,操作方式); fopen("…
至此groovy语言学习-语法基础就结束了,新的工作已经安排下来,要干活了. 对groovy了解到一定程度之后就可以在java项目中对其进行引入了.为此新建了一个微型的项目,个人觉得千言万语不如代码实现来得实在.程序员应该用代码来沟通,文字只是解释. 到此,感觉算是对groovy完成了入门练习.内部涉及的实现复杂和性能优化,超出目前学习能力范围,后续随着技能的提升可能还会去进一步研究.先到此为止了. 相关代码见项目:https://github.com/islowcity/groovy 项目中有…
2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的渊源以及和规则引擎的比较,作为白板目前还没评论的资格,学语言当然还是直接撸代码来得实在.好在和java同宗,白板之旅. package groovy /* * Print方法 print println 后面必须跟参数 否则会抛groovy.lang.MissingPropertyException…
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须和iOS端一致,这种情况在现实工作中实在是太常见了,因为对于一般用户来说,他们不太可能会在两个操作系统上分别去使用同一个应用,但是却必定会在同一个操作系统上使用不同的应用.因此同一个操作系统中各个应用之间的界面统一性要远比一个应用在双平台的界面统一性重要的多,只有这样,才能给使用者带来更好的用户体验…
Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep. ② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法. sleep不出让系统资源:wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU.一…