关键字:
OC中一些具有特定含义的,系统专门使用的字符串为“保留字”,或者叫“关健字”(keyword)
OC中的关键字全部都是小写
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、else
OC常量:
OC中的常量值用字符串表示,区分不同的数据类型
1.如整型常量:
3456
2.实型常量:
3.1415926
3.字符常量:
’a’
4.逻辑常量:
ture、false
5.字符串常量:
”helloiphone”
注意:
区分字符常量和字符串常量
OC变量:
OC变量是程序中最基本的存储单元,基要素包括变量名,变量类型和作用域。
TypevarName[=value];
例如:
Inti=580;
floatf=12.12f;
Doubled=0.795;
NSString*s=@”helloiphone”;
从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用。
程序的执行过程
1.Load代码到内存区
2.从Main函数开始执行
3.执行过程中的内存管理
OC变量的分类
按被声明的位置划分:
局部变量:
方法或语句块内部定义的变量
intmain(intargc,char*argv[])
{
@autoreleasepool{
inti=100;
NSLog(@"i=%d",i);
}
for(inti=0;i<10;i++){
Nslog(@"ival:
%d",i);
}
}
实例变量:
方法外部、类的内部定义的变量
@interfacePerson:
NSObject
{
intage;
intsex;
}
@end
按所属的数据类型划分:
基本数据类型变量
指针数据类型变量
OC局部变量与成员变量
方法体内部声明的变量(包括形参)称为局部变量:
方法体内部是指与方法对应的大括号内部
方法体外,类体内声明的变量为“实例变量”或者“成员变量”
@implementationPerson
-(void)getAge{
inta;
intb=a+5;//编译警告,变量a还未被初始化
floatc=2.8;
}
@end
OC数据类型
基本数据类型:
数值型:
整数类型int
浮点型float,double
字符串(char)
布尔型
空类型(void)
指针数据类型:
类(class)
id
C和OC的基本数据类型
int:
声明整型变量short:
声明短整型变量或函数
double:
声明双精度变量sigend:
声明有符号类型变量
float:
声明浮点型变量struct:
声明结构体变量
char:
声明字符型变量union:
声明共用体(联合)数据类型
id:
通用的指针类型unsigend:
声明无符号类型变量
enum:
声明枚举类型void:
声明函数无返回值或无参数
long:
声明长整型变量或函数
数据类型格式化说明符
数据类型
OC关键字
格式说明引导符
数据类型
OC关键字
格式说明引导符
整型
int
%d、%i
浮点型
float
%f
短整型
shortint
%hd、%hi
双精度型
double
%f
长类型
longint
%ld、%li
长双精度类
longdouble
%lf
无符号短整型
unsignedint
%u
无短整型
unsignedshort
%hu
无符号长整形
unsignedlong
%lu
整数类型
Oc中整数类型用int表示,格式化符号用%i或d%来表示
比如:
inta=100;
Oc语言的整型常量默认为int型,声明long型常量可以后加‘l’或‘L’,
如:
intb=600;//正确Longc=88888888888L;
类型
占用存储空间
值域范围
Byte
1个字节
-128~127
Short
2个字节
-215~215-1
Int
4个字节
-231~231-1
long
8个字节
-263~263-1
浮点类型
浮点类型的变量可以存储包括小数的值
oc中有两种浮点类型
float有效数字为6~7位,格式化说明符号用%f表示
double有效数字为15~16位,格式化说明符号用%f,%e或%g表示
oc中浮点型常里默认为double型,如果要声明一个常量为float,在数字的后面加f或F。
doublem=3.14159;//正确floatf=3.14f;
下面列出oc的各种浮点类型
类型
占用存储空间
值域范围
Float
4字节
-3.403E38
Double
8字节
-1.798E308~1.798E
字符串char
char型数据用来表示通常意义上的“字符”,格式化说明符用%c表示
字符常量为用单引号括起的单个字符,例如:
characher=’a’;charb=’0’;charcChar=’苹’;值域范围:
-128~`127
“\n”,oc编译器把这个当作单个字符
unsignedchar值域范围:
0~255
oc字符采用Unicode编码,每个字符占两个字节,因而可用十六进制编码形式表示
例如:
Charc1=’\u0061’;
注:
Unicode是全球语言统一编码
char类型(ASCII码)
值
符号
值
符号
值
符号
0
空字符
34
91
(
32
空格
45
-
92
\
33
!
46
.
93
]
34
“
47
/
94
^
35
#
48~57
0~9
95
-
36
$
58
:
96
`
37
%
59
;
97~122
a~z
38
&
60
<
123
{
39
‘
61
=
124
|
40
(
62
>
125
}
41
)
63
?
126
~
42
*
64
@
127
DEL(Delete键)
43
+
65~90
A~Z
逻辑型Boolean
Boolean类型指的是用于存储真值和假值的变量,一般用于程序流程控制。
Boolean类型数据允许取值true或false,也可以是0或非0的整数替代true和false,这点和java语言不同。
实例:
Booleanflag=true;
If(flag)
{
NSLog(@”HelloiPhone”);
}
限定词
longint:
声明变量xx为long的整型变量。
格式化字符为%li,如:
longinta;
longlongint:
声明变量xx为longlong的整型变量,格式化符%lli,如:
longlongintb;
longdouble:
跟int基本相同;
unsignedint:
声明无符号的整型变量。
如:
unsignedintc;
signedint:
声明有符号的整型变量。
如:
signedintd;
void类型
告诉编译器没有任何范围类型的值
不能像其它数据类型一样来声明变量
例如:
voidi=10;//错误
Void通常与方法一起搭配使用,比如:
-(void)test
{
//code;
}
id类型
Id类型是oc中独有的数据类型,它可以存储任何类型的对象,从某种意义上说,它就是一般的对象类型。
将number声明为id类型的变量。
如:
idnumber
格式化说明符:
%p
DataType
//基本数据类型
inti=10;
floatf=2.12f;
doubled=34.123e+11;
charc='x';
NSLog(@"i:
%d",i);
NSLog(@"f:
%.2f",f);//float类型保2位小数
NSLog(@"d:
%e",d);
NSLog(@"c:
%c",c);
//打印x对应的ASCII值
NSLog(@"ASCIIc=%d",c);//120
//打印基本数据类型所占用的字节
NSLog(@"sizeOfi=%ld",sizeof(i));
NSLog(@"sizeOff=%ld",sizeof(f));
NSLog(@"sizeOfd=%ld",sizeof(d));
NSLog(@"sizeOfc=%ld",sizeof(c));
基本数据类型转换
作业:
加、减、乘、除
Booleanflag=true;
while(flag){
chari;
floatnumber1,number2;
printf("a表示加法:
\n");
printf("b表示减法:
\n");
printf("c表示乘法:
\n");
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=%.1f\n",number1,number2,number1+number2);
break;
case'b':
printf("请输入第一个数:
\n");
scanf("%f",&number1);
printf("请输入第二个数:
\n");
scanf("%f",&number2);
printf("%.1f-%.1f=%.1f\n",number1,number2,number1-number2);
break;
case'c':
printf("请输入第一个数:
\n");
scanf("%f",&number1);
printf("请输入第二个数:
\n");
scanf("%f",&number2);
printf("%.1f*%.1f=%.1f\n",number1,number2,number1*number2);
break;
case'd':
printf("请输入第一个数:
\n");
scanf("%f",&number1);
printf("请输入第二个数:
\n");
scanf("%f",&number2);
printf("%.1f/%.1f=%.1f\n",number1,number2,number1/number2);
break;
case'q':
flag=false;
printf("已经退出\n");
break;
default:
break;
}
}
OC类的声明
@interfacePerson:
NSObject
{
//实例变量声明
intidetify;
intage;
}
//方法声明
-(id)initWithAge:
(int)_ageidentify:
(int)_identify;
-(int)getIdentify;
-(int)getAge;
-(void)setAge:
(int)_age;
@end
OC类的实例变量
OC的方法声明
OC中方法的调用
类的实现
@implementationPerson
-(id)initWithAge:
(int)_ageidentify:
(int)_identify
{
if(self=[superinit]){
age=_age;
idetify=_identify;
}
returnself;
}
-(int)getIdentify
{
returnidetify;
}
-(int)getAge
{
returnage;
}
-(void)setAge:
(int)_age
{
age=_age;
}
@end
OC面向对象的基本概念-指针
对象的创建和使用
类与对象的关系
对象的初始化
初始化方法的实现
指定初始化方法
内存分析
(1)
#import"Person.h"
intmain(intargc,constchar*argv[])
{
@autoreleasepool{
//insertcodehere...
NSLog(@"Hello,World!
");
//对象创建并初始化-----------------------
//Person*person;//nil
//person=[[Personalloc]init];//0x100102d40
//NSLog(@"person:
%p",person);
//对象创建并初始化,内存分析------------------
Person*person=[[Personalloc]initWithAge:
30identify:
321123];
NSLog(@"personAge=%d",[persongetAge]);
intage=28;
[personsetAge:
age];
NSLog(@"personAge2=%d",[persongetAge]);
[personsetAge:
++age];
NSLog(@"personAge3=%d",[persongetAge]);
NSLog(@"person栈内存地址:
%p",person);
}
return0;
}
约定俗称的命名规则
类名首字母大写
变量名和方法名首字母小写
使用驼峰标示
内存分析
(2)
//Person.h
//PersonAlloc
//CreatedbyLCSon14-4-16.
//Copyright(c)2014年LCS.Allrightsreserved.
#import
@interfacePerson:
NSObject
{
//实例变量声明
intidetify;
intage;
}
//方法声明
-(id)initWithAge:
(int)_ageidentify:
(int)_identify;
-(int)getIdentify;
-(int)getAge;
-(void)setAge:
(int)_age;
-(void)changeAge:
(int)_age;
-(void)changeInfo:
(Person*)_person;
-(void)changed:
(Person*)_person;
@end
//Person.m
//PersonAlloc
//CreatedbyLCSon14-4-16.
//Copyright(c)2014年LCS.Allrightsreserved.
#import"Person.h"
@implementationPerson
-(id)initWithAge:
(int)_ageidentify:
(int)_identify
{
if(self=[superinit]){
age=_age;
idetify=_identify;
}
returnself;
}
-(int)getIdentify
{
returnidetify;
}
-(int)getAge
{
returnage;
}
-(void)setAge:
(int)_age
{
age=_age;
}
-(void)changeAge:
(int)_age
{
_age=38;
}
-(void)changeInfo:
(Person*)_person
{
_person=[[Personalloc]initWithAge:
22identify:
894455656];
NSLog(@"_person:
%page:
%d",_person,[_persongetAge]);
}
-(void)changed:
(Person*)_person
{
[_personsetAge:
22];
}
@end
//main.m
//PersonAlloc
//CreatedbyLCSon14-4-16.
//Copyright(c)2014年LCS.Allrightsreserved.
#import
#import"Person.h"
intmain(intargc,constchar*argv[])
{
@autoreleasepool{
//insertcodehere...
NSLog(@"Hello,World!
");
Person*p1=[[Personalloc]initWithAge:
30identify:
3243242312];
intage=20;
Person*p2=[[Personalloc]initWithAge:
28identify:
455656231];
//age的值不变
[p1changeAge:
age];
NSLog(@"age:
%d",age);
//p1的值不变
[p1changeInfo:
p1];
NSLog(@"behind_person:
%page:
%d",p1,[p1getAge]);
//真正改变p2对象的值
[p1changed:
p2];
NSLog(@"p2age:
%d",[p2getAge]);
}
return0;
}
self和super关键字
self指的是类对象本身
super是父类对象本身
self用来调用本类对象的方法
super调用父类的方法
@class和#import
Import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
在头文件中,一般只需要知道被引用的类的名称就可以了。
不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。
而在实现类里面,因为会用这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
如果有循环依赖关系,如A->B,B->A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。
在实现个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import
@class用在.h文件里
#import用在.m文件里
设置器和访问器
#import
@interfacePerson:
NSObject
{
intmyNumber;//实例变量
}
-(int)myNumber;
-(void)setMyNumber:
(int)_number;
-(void)printInfo;
@end
#import"Person.h"
@implementationPerson
//get方法
-(int)myNumber
{
returnmyNumber;
}
//set方法
-(void)setMyNumber:
(int)_number
{
myNumber=_number;
}
//打印本类的信息
-(void)printInfo
{
NSLog(@"Personnumberis:
%d",myNumber);
}
@end
#import
#import"Person.h"
intmain(intargc,constchar*argv[])
{
@autoreleasepool{
//insertcodehere...
NSLog(@"Hello,World!
");
Person*person=[[Personalloc]init];
[personsetMyNumber:
100];
NSLog(@"Personnumber:
%d",[personmyNumber]);
}
return0;
}
Property属性
oc2.0简化设置器和访问器。
注意两个关健字“@property”“@synthesize”
#import
@interfacePerson:
NSO