OC 类的声明 实现 调用

2018-03-28  本文已影响7人  我是谁重要吗

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中定义也是可以但是一般不这么干)

上一篇 下一篇

猜你喜欢

热点阅读