Objective—C:
头文件 实现文件
C语言 .h .c
C++语言 .h .cpp
oc语言 .h .m
oc&c++ .h .mm
1.类的申明:
减号方法(普通方法又称对象方法)申明
加号方法(类方法,又称静态方法)申明
本质上就是一个函数
XYZPerson.h文件
@interface XYZPerson:NSObject
-(void)sayHello;
@end
2.类的实现
XYZPerson.m文件
#import "XYZPerson.h"
@implementtation XYZPerson
-(void)sayHello{
NSLog(@"Hello,World");
}
@end
3.数据类型:万能类型id其实也是一种指针
4.Objective-C中可以使用goto语句
5.实例化对象:
方法一:
People *p1 = [[People alloc] init];
//[类名 方法名]
//[对象名 方法名]
//alloc:方法名-为对象分配内存空间
//init:方法名-进行初始化操作
方法二:
People *p3 = [People new];
//new:是方法
4.const:
是constant的缩写,是不变的意思,用const修饰的变量是其值不能变的变量,我们称之为只读变量
只读变量只是其值不能变,其本身还是变量,不是常量
也可以用const来定义只读数组,表示数组元素是只读的
int const a[5] = {1,2,3,4,5};
或:
const int a[5] = {1,2,3,4,5};
用const定义指针变量p,是表示指针变量不能变,还是表示指针所指的空间内容不能变,需要按照const修饰的具体对象来确定
5.类内使用成员变量、类外使用属性
属性是为了让类外可以访问成员变量,换句换说是成员变量的外部接口
6.属性:
@property(nonatomic,strong)NSString *peopleName;
属性声明就等于set跟get两个函数
- (void) setName:(NSString *)name;
- (NSString *)getName;
属性既可以用来赋值也可以用来输出打印
属性可以简单的理解为就是get、set方法
7.成员变量写在.h或者.m文件中都可以,毕竟类外不会调用成员变量
8.方法的声明:
- (void)report;
调用:[p1 report];
+ (void)report1;
调用:[People report1];
//-、+是方法的类型,-代表对象方法,用对象名来调用;+代表类方法,用类名调用
减号方法中调加号方法:直接类名调用
[People report1];
加号方法中调减号方法:首先要实例化
[[People alloc] report];
加号方法中只能调用静态变量,不能调用成员变量
带参函数声明:
单个参数:showWithA:
- (int)showWithA:(int)a;
多个参数:showWithA: andB:
- (int)shwoWithA:(int)a andB:(int)b;
奇葩写法:
- (int):(int)a :(int)b;
函数名就是(: :)
9.初始化方法:
- (id)init;
- (instancetype)init;
//id是万能类型,可以返回任意类型而不需要精准的写入
//instancetype是返回当前类型,这个更推荐
自定义初始化方法:
-(instancetype)initWithPeopleName:(NSString *)name andPeopleAge:(int)age;
10.成员变量访问修饰符:
默认是受保护状态(protected)
@public
//在类外通过对象名->变量名来调用,对象名.变量名调用不到
//在类内类外都可以使用并且可以被继承
@private
//在类内可以使用,类外无法使用,不可以被继承
@protected
//在类内可以使用,类外无法使用,可以被继承
@package
//框架权限,在框架内相当于受保护,在框架外相当于私有
方法只在.m文件中写实现,不在.h方法中写声明的话,在.
11.OC没有多继承,如果要实现类似的效果,Java是接口,OC是协议
12.如果父类的方法没有写声明只写了实现,则子类无法继承父类中对应的方法
13.OC中不支持方法的重载,只支持方法的重写
14.成员变量如果写在.m文件里,那么注定了该成员变量为private只能自己才能用
方法也是,如果只在.m文件中实现那么只能自己调用,外部无法调用
15.程序报错的话在控制台搜索reason可以快速定位反馈的错误原因
16.//字符串拼接
NSString *newString = [NSString stringWithFormat:@”%d”,_speed];
17.char cstring = malloc(sizeof(char) 2);
scanf(“%s”, cstring);
NSString *string = [NSString stringWithUTF8String:cstring];
18.重写:只在子类的.m文件中重写方法即可
19.self指针:当前方法是谁在调用,self就是谁
20.OC中.只适用于他的成员属性,set、get方法也可以用.
21.@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic ,assign) float height;
OC对象用strong;其他对象用assign
22.成员属性的访问:
//第一种访问方式
_name = @”zhangsan”;
_age = 30;
_height = 180.0;
//第二种访问方式
self.name = @”zhangsan”;
self.age = 30;
self.height = 180.0;
23.继承和类别的异同:
相同目的:原类都无法完成我们现在的需求,需要更新原类的属性或者方法而扩展
不同点:继承:既能够扩展成员变量和成员属性,也能够添加方法;类别:只能添加方法
继承添加的新方法和新属性,都是在子类中调用;而类别添加的新方法可以在原类对象直接调用
24.类别的.h文件里定义的所有变量都是无效的,并且不允许,成员变量报错,属性不报错,但是也不能用
例如在Person+extention.h里定义
25.一般自定义的一些类会选择继承来扩展,因为可以扩展字段
系统类因为很多字段都是不能添加的,只能扩展方法,所以会选择类别的方式
26.Foundation框架中的基本数据结构:
NSString和NSMutableString(可变字符串)的使用
NSDictionary和NSMutableDictionary(可变字典)的使用
NSArray和NSMutableArray(可变数组)的使用
NSData的使用
NSValue的使用
27.NSMutableString:可变字符串
NSMutableString *str1 = @”hello world”;//这样定义可变字符串是错的
因为这样的话相当于指针指向了一个不可变的内存地址
28.NSArrary:数组
NSArray *arr = [[NSArray alloc]initWithObjects:@”One”,@”Two”,@”Three”,p, nil];
//其中p是自定义Person类的对象
//数组可以存储任意对象
//数组中的每一个对象,其实都是指向对象的地址
29.NSLog打印自定义对象时其实是调用了description方法
30.数组遍历方法:(3种)
//1.枚举遍历法
NSEnumerator *emumerator = [arr objectEnumerator];
id obj;
//注意是一个等号!!
while (obj = [emumerator nextObject]) {
NSLog(@”%@”,obj);
}
//2.快速遍历法
for(obj in arr){
NSLog(@"%@",obj);
}
//3.i 遍历,类似于C语言的遍历法
NSInteger count = [arr count];//得到数组当前元素个数
id tempObj = [arr objectAtIndex:0];//得到数组指定下标处的值
NSInteger i = 0;
for (i; i<[arr count]; i++) {
NSLog(@"%@",[arr objectAtIndex:i]);
}