OC 类的声明 实现 调用

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容