标签:
Objective-C 简称OC。
OC是c语言的超集,简单来说就是,OC全面包容C语言,也就是在OC中,可以使用C语言代码,编译器可以兼容C语言,并对其进行编译,执行。
面向过程,就是在一个整体思路定好的情况下,按照这个思路一直走下去,这种情况的代码,就会比较稳定。但是,这种面向过程的思想,会比较坑爹,为什么这么说?因为,当需求改变的时候,也就是逻辑中,有一个步骤改变的话,就会改动整个程序,相当于重新写了一遍程序。导致程序的重用性不高。
区别:分析解决问题的步骤,实现函数,依次调用函数
面向对象,其实就是在编码前,把具有相同特征和行为的东西抽出来,组成一个类型,这些类型,在没有使用的时候,没有半点关系,一直到使用的时候,才会将这些类型相互作用。这种方式,在需求改变时,也就是逻辑改变时,不需要将整个程序重写,只需要将改动的那个类抽出来,改成我们需要的即可。这种面向对象的编程编译的时候,是我看一句,我就告诉你这一句的意思,按照我有什么,我就写什么的思想进行编写的。面向对象不比面向过程稳定,但是比面向过程灵活,多样。
区别:分析某问题需要参与的对象,各个对象的作?,多个对象协作完成任务。
面向对象,离不开面向过程。因为在面向对象中,把同类型的东西拿出来之后,按照思路进行编写的时候,也是面向过程。
面向对象有三大特征:继承、封装、多态。
类是具有相同特征和行为的事物的抽象。
对象是一个类的具体实现。
类和对象的关系:
类是对象的类型(与int、float类似),可以这么说,我的奥迪A6(对象),的类型是汽车(类型)。
对象是类的实例,也就是说,汽车里(类型)有一辆车是我的奥迪A6(对象)。
在开发的时候,先定义一个类型,类。然后才能创建对象。
OC中,定义类的时候,分成两个文件:.h接口文件,.m实现文件。
.h接口文件,用来声明类的特征和行为。
.m实现文件,用来实现.h文件里声明的特征和行为。
.h文件里,接口部分,用@interface…….@end来标识,在这期间,声明类的实例变量和方法,即特征和行为。.h文件,包含了类名、父类名、实例变量、方法。
// 2015-04-13 11:19:28 北京
//引入框架 #import <Foundation/Foundation.h>
//我们创建的类,只是一种类型,用这种类型创建出对象。 //.h 文件代表接口,类似于说明书,里边有我们的 实例变量 和 方法声明。 //.m 文件,目前 只有方法实现。 //接口 类名 :类名 @interface Person : NSObject{
//写特征的 //这些特征,有一个名字叫做实例变量 //规范:在实例变量名前加下划线 _ //可见度 @public NSString *_name; NSInteger _age; NSString *_sex; } //这里写的行为,都是声明的。 //我们叫这些行为叫做方法,(理解为C语言中的函数) //无参无返回值 -(void) sayHi; //结束接口 @end |
解释:
1、#import <Foundation/Foundation.h>,在每一个声明文件开始时,都要引入这个类库。
2、@interface Person: NSObject,@interface是接口开始的标识,其后直接跟我们定义的类的类名,:NSObject表示继承了NSObject这个基类。
3、@public这个表示实例变量的可见度,可见度可分为@private,@protected等。
4、 NSString *_name;
NSInteger _age;
NSString *_sex;
表示Student类有三个实例变量。_name和_sex是字符串类型的,_age是整型的。在OC中,用了nextStep这个语言的前缀NS来标记各种类型。在oc中基本类型来定义实例变量,不用加* 号,不是基本类型的才用加上 * 号。NSString是字符串类型,不是基本类型,NSIteger是基本数据类型,不用加 * 号。
命名规范,OC中规定了在实例变量前加上下划线 _ 。
5、-(void)sayHi; - 号表示,这个是一个实例方法,写在{ }外面。这个方法的方法名是sayHi,返回值是void型的。
6、@end,表示接口的结束
.m文件里,用来实现.h文件声明的方法以及可以对实例变量进行初始化赋值,即重写init方法。
//引入了Person头文件 #import "Person.h"
//实现 类名 @implementation Person //这里所说的实现,是实现方法 -(void) sayHi{
NSLog(@"大家好。"); } //重写init方法 //instancetype:任意的对象类型 -(instancetype)init{
//赋初值(一旦创建出来的对象,就有这些值)
//在类内使用实例变量,直接使用实例变量的名字即可。 _name = @"大白"; _age = 19; _sex = @"男";
//self表示自己。 //self其实就是一个指针,指向自己。 //必须返回self //这个初始化方法不完整,所以看不出它的作用。 return self; } |
解释:
1、#import "Person.h",在实现文件里的第一件事,就是将这个类的头文件引过来。只有这样,才是在写实现方法时,用到类的时候,识别这个类是什么。
2、@implementation Person,@implementation 表示实现的开始,后面跟着
Person(类名),表示我要实现Person类。
3、-(void) sayHi{
NSLog(@"大家好。");
}
这里是在.h文件中声明的方法,我们在这里实现,- 号表示这是一个实例方法,方法明为sayHi,返回值是void。NSLog(@"大家好。");与C语言的printf方法一样。OC中,在每一个字符串前,都要加上@。如@”呵呵”。
4、-(instancetype)init{
//在累内使用实例变量,直接使用实例变量的名字即可。
_name = @"大白";
_age = 19;
_sex = @"男";
//self表示自己。
//self其实就是一个指针,指向自己。
//必须返回self
//这个初始化方法不完整,所以看不出它的作用。
return self;
}
这是一个实例方法,是我们重写init初始化方法的一个例子。- 号表示是实例方法,方法明是init,返回值是instancetype,即任意类型的指针。在类里边的实例变量可以直接使用变量名进行赋值(即为初始化成我们想要的值)。return self的意思是返回自己。它自己就是一个指针。在内存中,我的init方法地址指向的是它自己的首地址,self是后面存在的,在返回self时,这个self和函数名一样指向同一个地方。
在main.m文件中,我们对创建好的类进行实例化,对其创建一个对象。这样说,其实是与int a = 10;是一样的,我们创建的类,相当于int类型,我们创建的实例对象,相当于a。
创建对象的方式:
1、
Person *p = [Person alloc]这一步是分配内存。为类方法
p = [p init];这一步是进行实例化。为实例方法
OC中,[]表示调用方法,形式为[类名 方法名]。方法分为两种
(1)、类方法:与实例方法相反,用 + 号在前标识 。+(id)alloc;
(2)、实例方法:用 – 号在前标识。-(void)sayHi{}
2、Person *p = [[Person alloc]init];分配内存后直接初始化。
#import <Foundation/Foundation.h>
//写好一个类,要使用的时候,首先记得引入 #import "Person.h" #import "Student.h" int main(int argc, const char * argv[]) { //2015-04-13 11:05:18 北京
//内存管理,能够帮助我们释放内存。 @autoreleasepool {
//类类型,加 * 号。
//字符串 //nextStep 简称NS,看到NS前缀的,都是OC里边用的。 //@:cocoa的一个符号。字符串前都要加上@符。 NSString *str1 = @"大白";
//基本数据类型。不加 * 号的。 //整型 NSInteger num1 = 10;
//float
CGFloat f1 = 1.2;
//所有的对象(类创建出来的)都用%@占位符 NSLog(@"%@",str1);//2015-04-13 11:13:04.208 OCLesson1_类和对象[933:38999] 大白
//创建一个Person对象 //1. //分配内存 Person *p1 = [Person alloc];//类方法 //初始化 p1 = [p1 init];//实例方法
//2. //先分配了内存,然后初始化。 Person *p2 = [[Person alloc] init];
//1、+ 表示类方法 //OC中使用类方法:[类名 方法名]
//2、- 表示实例方法
//OC中使用实例方法,要用[对象 方法名]。 [p2 sayHi];//2015-04-13 15:15:08.788 OCLesson1_类和对象[1858:97196] 大家好。 } return 0; } |
形式为[对象名 方法名]。
OC中使用对象的方式:
对象名—>实例变量名。与结构体指针,有点类似。
Person *pn = [[Person alloc] init]; //使用实例变量:对象名 ->实例变量名。
NSLog(@"%@",pn->_name);//2015-04-13 15:25:44.140 OCLesson1_类和对象[1902:100456] (null) //给 _name 赋值 pn->_name = @"小金刚"; NSLog(@"%@",pn->_name);//2015-04-13 15:25:44.141 OCLesson1_类和对象[1902:100456] 小金刚
pn->_age = 20; pn->_sex = @"妹子";
NSLog(@"%ld",pn->_age); NSLog(@"%@",pn->_sex); |
一个例子:
创建一个student对象,给他的实例变量赋值,并且打印出来。
Student.h文件
#import <Foundation/Foundation.h>
@interface Student : NSObject{ @public NSString *_name; NSInteger _age; }
-(void)sayHi;
@end |
Student.m文件
#import "Student.h"
@implementation Student
-(void)sayHi{
NSLog(@"好好学习,天天向上..."); }
//重写init方法 -(instancetype)init{ _name = @"摩托罗拉"; _age = 20; return self; }
@end |
main.m文件
#import <Foundation/Foundation.h>
//写好一个类,要使用的时候,首先记得引入 #import "Person.h" #import "Student.h"
int main(int argc, const char * argv[]) { // //创建一个student对象,给他的实例变量赋值,并且打印出来。 // Student *stu = [[Student alloc] init]; // stu->_name = @"阴天"; // stu->_age = 19; // NSLog(@"%@",stu->_name);//2015-04-13 15:36:09.471 OCLesson1_类和对象[1941:103393] 阴天 // NSLog(@"%ld",stu->_age);//2015-04-13 15:36:09.472 OCLesson1_类和对象[1941:103393] 19
// Person *p5 = [[Person alloc] init]; // NSLog(@"%@",p5->_name);//2015-04-13 15:57:37.197 OCLesson1_类和对象[2018:108183] 大白 // NSLog(@"%@",p5->_sex);//2015-04-13 15:57:37.198 OCLesson1_类和对象[2018:108183] 男 // NSLog(@"%ld",p5->_age);//2015-04-13 15:57:37.198 OCLesson1_类和对象[2018:108183] 19
Student *stu = [[Student alloc]init];
NSLog(@"%@",stu->_name);//2015-04-13 16:15:57.148 OCLesson1_类和对象[2084:114560] 摩托罗拉 NSLog(@"%ld",stu->_age);//2015-04-13 16:15:57.149 OCLesson1_类和对象[2084:114560] 20
} return 0; } |
一个练习:
将大象装进冰箱分几步?三步:打开冰箱门,把大象装进去,关上冰箱门。
Elephant.h文件
#import <Foundation/Foundation.h>
@interface Elephant : NSObject{ @public
NSString *_name; NSString *_color; } //装入 -(void)incase; @end |
Elephant.m文件
#import "Elephant.h"
@implementation Elephant
- (instancetype)init{ _name = @"艾莉芬特"; _color = @"土豪金"; return self; } -(void)incase{ NSLog(@"靠,谁把老子装冰箱里了...??"); } @end |
IceBox.h文件
#import <Foundation/Foundation.h>
@interface IceBox : NSObject{ @public NSString *_brand; } - (void)open; - (void)closed; @end
|
IceBox.m文件
#import "IceBox.h"
@implementation IceBox
- (instancetype)init{ _brand = @"西门庆"; return self; } - (void)open{ NSLog(@"冰箱门打开..."); } - (void)closed{ NSLog(@"冰箱门关上了..."); }
@end |
main.m文件
#import <Foundation/Foundation.h> #import "Elephant.h" #import "IceBox.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建大象对象 Elephant *el = [[Elephant alloc] init]; //创建冰箱对象 IceBox *icb = [[IceBox alloc] init];
NSLog(@"大家好,我是%@,我是%@颜色..",el->_name,el->_color); NSLog(@"大家好,我是 %@ 冰箱..",icb->_brand); //面向对象三大特性:封装,继承,多态 //封装,屏蔽内部细节,让别人只看.h文件,就知道怎么用了。 //这里的方法调用,体现了封装。 [icb open]; [el incase]; [icb closed]; } return 0; } |
这个例子特别注意就是如何屏蔽内部细节代码,让别人只看到.h文件东西,不能看到.m文件的代码,这样保护自己的代码。
标签:
原文地址:http://www.cnblogs.com/DevinSMR/p/5117780.html