OC是一门面向对象的语言,因此它也有类、对象、静态\动态方法、成员变量的概念。
面向对象以及面向过程:https://www.jianshu.com/p/615d48c7d7a2
把建立空间的声明称之为"定义",而把不需要建立存储空间称之为"声明"。
类的解释:
在OC中,一般用.h文件以及.m两个文件来描述一个类:
.h文件:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。
注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。
.m文件:类的实现文件,用于实现.h文件中声明的方法。类的实现使用关键字@implementation和@end。
(编译器只会编译.m文件,并不会编译.h文件。
编译器会将.m文件编译为.o目标文件,
比如main.m编译成功后会变成main.o文件)
类的创建/声明:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
/*
OC中使用关键字@interface来声明一个类,@interface后面紧跟着类名ViewController。
冒号":"表示继承,ViewController继承自UIViewController。
因为UIViewController被声明在UIKit.h中,所以在第1行用#import包含了UIKit.h文件。
*/
关键字:#include #import @class @import 详见:
https://www.jianshu.com/p/0bf31bf5de0a
类的实现:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//因为ViewController这个类是声明在ViewController.h中的,所以在第1行用#import包含了ViewController.h文件。
如果你不包含ViewController.h,第4行代码肯定报错,因为它根本不知道ViewController是个什么。
//OC中使用关键字@implementation来实现一个类。@implementation后面紧跟的类名,表示究竟要实现哪一个类。
interface 类名后加个括号是什么意思
是Category语法 ,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,我们可以为任何已经存在的class添加方法。
@interface @property @synthesize详解:
https://www.jianshu.com/p/d9681560a522
成员变量 以及 成员方法:
正常情况下,我们都是把成员变量定义在头文件中,也就是类的声明文件(.h)中
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
NSString *_name;
int _age;
}
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
- (void)printNameAndAge;
@end
//定义了一个int类型的成员变量_age(加"_"为了区分局部变量),_age的默认作用域是@protected,即可以在ViewController类内部和子类中访问,外接不能直接访问。成员变量必须写在大括号{ }里面(为了保证面向对象数据的封装性,我们可以提供age的get方法和set方法,让外界间接访问age。)
//方法的声明和实现,都必须以 + 或者 - 开头
//+ 表示类方法(静态方法)
//- 表示对象方法(动态方法) 实例方法
//在.h中声明的所有方法作用域都是public类型,不能更改
@property() 里面的详见 :
https://www.jianshu.com/p/db9b5c9407a4
数据类型:
成员变量作用域:
1 @public 全局都可以访问
2 @protected 只能在类内部和子类中访问
3 @private 只能在本类内部访问,类外,子类不可以直接访问!
静态方法以及动态方法
setter以及getter方法:
nonatomic,assign 详见:
成员方法实现:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)printNameAndAge{
NSLog(@"name=%@ age=%d",_name,_age);
}
@end
类的使用(创建对象):
给对象分配存储空间 以及 调用ViewController这个类的构造方法进行初始化
在其他.m文件中 首先引入该类文件:
#import "ViewController.h"
然后再创建:
ViewController *vc = [[ViewController alloc] init];
vc.name = @"Miller";
[vc printNameAndAge];
调用ViewController类的静态方法alloc,返回分配好内存的ViewController对象
它的返回值类型是id,这个id代表任何指针类型,你可以暂时理解为:id可以代表任何OC对象,类似于NSObject 。
init是动态方法 init会返回已经初始化完毕的对象,再次赋值给了vc变量。
所有OC对象都是用指针变量来接收的
前面我们调用了ViewController的alloc、init、new方法,但是你会发现ViewController.h中并没有声明这些方法,为什么能够调用呢?原因很简单,这些方法都是父类UIViewController的,子类当然可以调用父类的方法。
self是隐含在对象中的指针,指向对象的首地址
每个对象都隐含self指针,这个self指针就指向对象的首地址
%@ 用于打印对象 %p打印地址
用%@打印一个对象的时候,实际上是对这个对象发送description 消息!
打印这个对象其实是打印的这个对象里面自己定义的description方法
成员变量:
定义在.h{}号中的变量.
实例变量:
如果成员变量的数据类型是一个类则称这个变量为实例变量.
也就是所谓的类私有变量
属性变量:
@property (nonatomic, strong) UIButton *myButton;
局部变量:
.m文件 {} 号中的变量.
全局变量:
定义:在@implementation外定义的变量(在@implementation中定义也是可以但是一般不这么干)