1、ObjectiveC学习笔记-OC基础语法标示符:OC语言中对各种变量、方法和类等要素命名时使用的字符序列称为标示符。OC标示符有如下命名规则:1. 标示符由字母、下划线“_”、美元“$”和数字组成2. 标示符必须以字母、下划线、美元符号开头3. OC标示符大小写敏感,长度无限制约定俗成:OC标示符选取要“见名知意”,并且不能与OC中保留字重名。 合法标示符:ZhangSan、Dog、_988、$as_34d 非法标示符:if、GirL*#、sad90、34_sdf关键字: OC中一些具有特定含义的,系统专门使用的字符串为“保留字”,或者叫“关健字”(keyword) OC中的关键字全部都是小
2、写int、double、struct、break、long、aout、switch、case、enum、register、typedef、char、extern、return、union、const、float、short、unsigned、continue、for、signed、void、default、goto、sizeof、volatile、do、while、static、if、elseOC常量: OC中的常量值用字符串表示,区分不同的数据类型1. 如整型常量:34562. 实型常量:3.14159263. 字符常量:a4. 逻辑常量:ture、false5. 字符串常量:”hello
3、iphone”注意:区分字符常量和字符串常量OC变量: OC变量是程序中最基本的存储单元,基要素包括变量名,变量类型和作用域。 Type varName =value; 例如: Int i=580;float f = 12.12f;Double d = 0.795; NSString *s = ”hello iphone”; 从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。程序的执行过程1. Load代码到内存区2. 从Main函数开始执行3. 执行过程中的内存管理OC变量的分类按被声明的位置
4、划分: 局部变量:方法或语句块内部定义的变量int main(int argc, char * argv) autoreleasepool int i= 100; NSLog(i=%d,i); for (int i=0; i10; i+) Nslog(i val:%d,i); 实例变量:方法外部、类的内部定义的变量 interface Person : NSObject int age; int sex;end按所属的数据类型划分: 基本数据类型变量 指针数据类型变量OC局部变量与成员变量 方法体内部声明的变量(包括形参)称为局部变量: 方法体内部是指与方法对应的大括号内部 方法体外,类体内声
5、明的变量为“实例变量”或者“成员变量”implementation Person-(void)getAge int a; int b=a+5;/编译警告,变量a还未被初始化 float c=2.8;endOC数据类型基本数据类型:数值型:整数类型 int浮点型 float,double字符串(char)布尔型空类型(void)指针数据类型: 类(class)idC和OC的基本数据类型int: 声明整型变量 short: 声明短整型变量或函数double: 声明双精度变量 sigend: 声明有符号类型变量float: 声明浮点型变量 struct: 声明结构体变量char: 声明字符型变量 u
6、nion: 声明共用体(联合)数据类型id: 通用的指针类型 unsigend:声明无符号类型变量enum: 声明枚举类型 void: 声明函数无返回值或无参数long: 声明长整型变量或函数数据类型格式化说明符数据类型OC关键字格式说明引导符数据类型OC关键字格式说明引导符整型int%d、%i浮点型float%f短整型short int%hd、%hi双精度型double%f长类型long int%ld、%li长双精度类long double%lf无符号短整型unsigned int%u无短整型unsigned short%hu无符号长整形unsigned long%lu整数类型Oc中整数类型
7、用int表示,格式化符号用%i或d%来表示比如:int a=100;Oc 语言的整型常量默认为int型,声明long型常量可以后加l或L, 如:int b=600; /正确 Long c=88888888888L;类型占用存储空间值域范围Byte1个字节-128127Short2个字节-215215-1Int4个字节-231231-1long8个字节-263263-1浮点类型浮点类型的变量可以存储包括小数的值oc中有两种浮点类型 float 有效数字为67位,格式化说明符号用%f表示 double 有效数字为1516位,格式化说明符号用%f,%e或%g表示oc中浮点型常里默认为double型,
8、如果要声明一个常量为float,在数字的后面加f或F。double m= 3.14159; /正确 float f=3.14f;下面列出oc的各种浮点类型类型占用存储空间值域范围Float4字节-3.403E38Double8字节-1.798E3081.798E字符串charchar型数据用来表示通常意义上的“字符”,格式化说明符用%c表示字符常量为用单引号括起的单个字符,例如:char acher=a; char b=0; char cChar=苹; 值域范围:-128127“n”,oc编译器把这个当作单个字符unsigned char 值域范围:0255oc字符采用Unicode编码,每个
9、字符占两个字节,因而可用十六进制编码形式表示例如: Char c1=u0061; 注:Unicode是全球语言统一编码char类型(ASCII码)值符号值符号值符号0空字符34,91(32空格45-9233!46.9334“47/9435#48570995-36$58:9637%59;97122az38&6012541)63?12642*64127DEL(Delete键)43+6590AZ逻辑型BooleanBoolean类型指的是用于存储真值和假值的变量,一般用于程序流程控制。Boolean类型数据允许取值true或false,也可以是0或非0的整数替代true和false,这点和java语
10、言不同。实例:Boolean flag=true;If(flag) NSLog(”Hello iPhone”);限定词long int:声明变量xx为long的整型变量。格式化字符为%li,如:long int a;long long int:声明变量xx为long long的整型变量,格式化符%lli,如:long long int b;long double:跟int基本相同;unsigned int:声明无符号的整型变量。如:unsigned int c;signed int:声明有符号的整型变量。如:signed int d;void类型告诉编译器没有任何范围类型的值不能像其它数据类型
11、一样来声明变量例如:void i=10;/错误Void 通常与方法一起搭配使用,比如:-(void) test/code;id 类型Id类型是oc中独有的数据类型,它可以存储任何类型的对象,从某种意义上说,它就是一般的对象类型。将number声明为id类型的变量。如:id number格式化说明符:%pDataType /基本数据类型 int i=10; float f=2.12f; double d=34.123e+11; char c=x; NSLog(i:%d,i); NSLog(f:%.2f,f); /float类型保2位小数 NSLog(d:%e,d); NSLog(c:%c,c);
12、 /打印x对应的ASCII值 NSLog(ASCII c%d,c); /120 /打印基本数据类型所占用的字节 NSLog(sizeOf i%ld,sizeof(i); NSLog(sizeOf f%ld,sizeof(f); NSLog(sizeOf d%ld,sizeof(d); NSLog(sizeOf c%ld,sizeof(c);基本数据类型转换作业:加、减、乘、除Boolean flag=true; while (flag) char i; float number1,number2; printf(a表示加法:n); printf(b表示减法:n); printf(c表示乘法:n
13、); printf(d表示除法:n); printf(q表示退出:n); scanf(%c,&i); switch (i) case a: printf(请输入第一个数:n); scanf(%f,&number1); printf(请输入第二个数:n); scanf(%f,&number2); printf(%.1f + %.1f %.1fn,number1,number2,number1+number2); break; case b: printf(请输入第一个数:n); scanf(%f,&number1); printf(请输入第二个数:n); scanf(%f,&number2);
14、printf(%.1f - %.1f %.1fn,number1,number2,number1-number2); break; case c: printf(请输入第一个数:n); scanf(%f,&number1); printf(请输入第二个数:n); scanf(%f,&number2); printf(%.1f * %.1f %.1fn,number1,number2,number1*number2); break; case d: printf(请输入第一个数:n); scanf(%f,&number1); printf(请输入第二个数:n); scanf(%f,&number
15、2); printf(%.1f / %.1f %.1fn,number1,number2,number1/number2); break; case q: flag=false; printf(已经退出n); break; default: break; OC类的声明interface Person : NSObject /实例变量声明 int idetify; int age;/方法声明-(id)initWithAge:(int)_age identify:(int)_identify;-(int)getIdentify;-(int)getAge;-(void)setAge:(int)_ag
16、e;endOC类的实例变量OC的方法声明OC中方法的调用类的实现implementation Person-(id)initWithAge:(int)_age identify:(int)_identify if (self=super init) age=_age; idetify=_identify; return self;-(int)getIdentify return idetify;-(int)getAge return age;-(void)setAge:(int)_age age=_age;endOC面向对象的基本概念指针对象的创建和使用类与对象的关系对象的初始化初始化方法的实
17、现指定初始化方法内存分析(1)#import Person.hint main(int argc, const char * argv) autoreleasepool / insert code here. NSLog(Hello, World!); /对象创建并初始化 / Person *person; /nil / person=Person alloc init; /0x100102d40 / NSLog(person:%p,person); /对象创建并初始化,内存分析 Person *person=Person allocinitWithAge:30 identify:321123
18、; NSLog(person Age=%d,person getAge); int age=28; person setAge:age; NSLog(person Age2=%d,person getAge); person setAge:+age; NSLog(person Age3=%d,person getAge); NSLog(person栈内存地址:%p,person); return 0;约定俗称的命名规则类名首字母大写变量名和方法名首字母小写使用驼峰标示内存分析(2)/ Person.h/ PersonAlloc/ Created by LCS on 14-4-16./ Copy
19、right (c) 2014年 LCS. All rights reserved.#import interface Person : NSObject /实例变量声明 int idetify; int age;/方法声明-(id)initWithAge:(int)_age identify:(int)_identify;-(int)getIdentify;-(int)getAge;-(void)setAge:(int)_age;-(void)changeAge:(int)_age;-(void)changeInfo:(Person *)_person;-(void)changed:(Pers
20、on *)_person;end/ Person.m/ PersonAlloc/ Created by LCS on 14-4-16./ Copyright (c) 2014年 LCS. All rights reserved.#import Person.himplementation Person-(id)initWithAge:(int)_age identify:(int)_identify if (self=super init) age=_age; idetify=_identify; return self;-(int)getIdentify return idetify;-(i
21、nt)getAge return age;-(void)setAge:(int)_age age=_age;-(void)changeAge:(int)_age _age=38;-(void)changeInfo:(Person *)_person _person=Person alloc initWithAge:22 identify:894455656; NSLog(_person:%p age:%d,_person,_person getAge);-(void)changed:(Person *)_person _person setAge:22;end/ main.m/ PersonA
22、lloc/ Created by LCS on 14-4-16./ Copyright (c) 2014年 LCS. All rights reserved.#import #import Person.hint main(int argc, const char * argv) autoreleasepool / insert code here. NSLog(Hello, World!); Person *p1=Person allocinitWithAge:30 identify:3243242312; int age=20; Person *p2=Person allocinitWit
23、hAge:28 identify:455656231; /age的值不变 p1 changeAge:age; NSLog(age:%d,age); /p1的值不变 p1 changeInfo:p1; NSLog(behind _person:%p age:%d,p1,p1 getAge); /真正改变p2对象的值 p1 changed:p2; NSLog(p2 age:%d,p2 getAge); return 0;self和super关键字 self指的是类对象本身 super是父类对象本身 self用来调用本类对象的方法 super调用父类的方法class和#importImport会包含
24、这个类的所有信息,包括实体变量和方法,而class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。在头文件中,一般只需要知道被引用的类的名称就可以了。不需要知道其内部的实体变量和方法,所以在头文件中一般使用class来声明这个名称是类的名称。而在实现类里面,因为会用这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。如果有循环依赖关系,如A-B,B-A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用class在两个类的头文件中相互声明,则不会有编译错误出现。所以,一般来说,
25、class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。在实现个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要importclass用在.h文件里#import用在.m文件里设置器和访问器#import interface Person : NSObject int myNumber;/实例变量-(int)myNumber;-(void)setMyNumber:(int)_number;-(void)printInfo;end#import Person.himplementation Person/get方法-(in
26、t)myNumber return myNumber;/set方法-(void)setMyNumber:(int)_number myNumber=_number;/打印本类的信息-(void)printInfo NSLog(Person number is : %d,myNumber);end#import #import Person.hint main(int argc, const char * argv) autoreleasepool / insert code here. NSLog(Hello, World!); Person *person=Person alloc init; person setMyNumber:100; NSLog(Person number : %d,person myNumber); return 0;Property属性oc2.0简化设置器和访问器。注意两个关健字“property” “synthesize”#import interface Person : NSO
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1