1 import 引入头文件 可以防止重复包含 include 需要预处理指令。
2 NSLog 参数的是NSString 类型对象
printf 参数是字符串指针。
NSLog 可以自动换行 输入的内容有日期和项目名称
NSString 是OC的特有用来定义字符串C中不支持
NSLog 可以格式化输出 %@ 打印字符串 但不支持C%s
C中不能使用%@打印字符串。
3 @符号的使用
@“xx” 表示xx是OC中的一个字符串。
@标识符 表示OC中的关键字
4 OC中的注释和C的相同
5 OC可以向下兼容C可以使用C中的函数调用方法和C 相同。
6 OC和C差异
1) 源文件对比
C中有.c .o .out .h
OC中 .h .m
2)基本数据类型
OC添加了一个 bool类型和block类型。
指针数据类型class(类) id
特殊类型 SEL nil(空对象)
3) 增强了for 快速变量数组和字典等集合。
4) 方法定义
5) Boolean 作用 判断逻辑值 0 假 非0真
存储的值 true 1 false 0
BOOL 类似Boolean YES 1 NO 0
6) 添加异常捕捉机制。
7 面向对象
面向过程: 强调的是功能行为
关注的解决问题需要哪些步骤
面向对象:将功能封装进对象,强调具备了功能的对象
关注解决问题需要哪些对象
面向对象是基于面向过程的。
特性:封装 继承 多态
类:是具有相似内部状态和运动规律实体的集合。(名词提炼法)
类的构成:类型 属性 和方法(行为或对属性中的数据进行操作的方法)
对象:对类的相同特征属性和运动规律的提取。图纸
8 类的声明(.h)和实现(.m)
方法:相当于C中的函数。
+动态方法
- 静态方法 类似java中static定义的方法
声明(@interface):声明类的属性和方法
@interface 类名:父类 {
成员变量 //成员变量声明
}
方法声明
@end //以@end 结束该类的声明
@interface Person:NSObeject {
@public;
NSString *name; //成员变量声明
int age;
}
@end //以@end 结束该类的声明
方法的实现(@implementation)实现声明中定义的方法
@implementation 类名
声明方法的实现
@end
9 对象的创建
OC中对象创建时都是创建的对象指针
类名 *对象名=[类名 new];
Person *person =[ Person new];
new 的作用:向计算机申请内存空间 给成员变量赋初值 返回申请空间的首地址。
10 成员变量的访问
person->name=@“xiaoming”; //成员变量赋值
person->age=15;
点语法
person.name=@“xiaoming”; //成员变量赋值
person.age=15;
NSLog(@”name:%@ \t age:%d”, person->name, person->age);//成员变量的使用。
10 方法的定义、实现和调用
方法前 + 表示动态方法 – 表示静态方法
声明在@interface内 实现在@implementation内
1) 无参无返回值对象方法的声明
-(void) 方法名;
无参无返回值对象方法的实现
-(void) 方法名{
代码块
}
方法调用 [对象 方法名];
2) 有参无返回值对象方法的声明
参数之间可以加一些修饰词。
-(void) 方法名 : (参数类型) 参数名 :(参数类型)参数名 ;
有参无返回值对象方法的实现
-(void) 方法名 : (参数类型) 参数名1 :(参数类型)参数名2 {
} 注意 每个参数之前有冒号分隔 冒号算方法名的一部分
有参无返回值对象方法的实现
方法调用 [对象 方法名:实参1:实参2];
//
// main.m
// 1 类的声明、实现和调用
//
//
#import<Foundation/Foundation.h>
@interfacePerson :NSObject
{
NSString *_name;
int _age;
}
//无参无返回值对象方法的声明
-(void)run;
// 有参无返回值对象方法声明
-(void)run:(NSString *)name andSpeed :(int)speed ;
@end
@implementationPerson
//无参无返回值对象方法的实现
-(void)run{
NSLog(@"person is running");
};
// 有参无返回值对象方法实现
-(void)run:(NSString *)name andSpeed :(int)speed {
NSLog(@" %@ is running by %dkmph",name ,speed);
}
@end
intmain(int argc, const char * argv[]) {
@autoreleasepool {
Person *p= [Person new];
//无参无返回值对象方法的调用
[p run];
// 有参无返回值对象方法调用
[p run:@"xiaoming"andSpeed:100];
}
return 0;
}
11 对象的存储细节
创建对象 Person *p =[Person new];
代码区:存放了类的成员变量及对象方法
堆区:new生成的对象后,堆区中存放了类的成员变量及其初值。
还有一个 _isa指针存放代码区的类的首地址。
并将该实例对象的首地址返回。
栈区:Person *p 之后,栈区存放了指针变量p 并接收new返回的实例对象地址。
调用函数时 先找堆区的实例对象_isa 指针 通过_isa指针找代码区的代码。
12 #pragma mark 组名
#pragma mark – 组之间加一条横线.
13 函数和对象方法对比
对象方法
1)对象方法的声明只能写在 @interface @end之间,对象方法的实现只能写在@implementation @end之间。
2)对象方法都以 – 开头 类方法以+开头
3)对象方法只能由对象来调用,类方法只能由类调用
4) 对象方法归类或者对象所有。
函数
1) 函数属于整个文件,可以写在文件任何位置。
2) 函数不存在隶属关系
3) 可以直接调用
4) 不可以访问对象中的成员变量。
14 常见错误
1) 声明和实现不能嵌套
2) 声明和实现必须同步
3) 成员变量必须写在{}内
4) 成员变量声明时不能赋值。
5) 成员变量不能使用static