OC部分
第一部分 基本概念
OC概述
OC是一种能够完成复杂面向对象编程的简单的计算机设计语言。
通过提供用于定义类和方法的语法,它扩展了标准的c语言。它还提供了类和接口(任何类采用)的动态扩展。
面向对象编程
1. 面向对象 和 面向过程
面向对象 OOP(
Object Oriented Programming
) 分解问题组成的对象 协调对象间的联系和通信 解决问题. 以对象为中心 也就是参数事件的参与者,设计对象的功能完成事件只是事物所有功能中的一小部分.
面向过程 POP (P
rocedure Oriented
Programming)
分析解决问题的步骤 实现函数 依次调用. 事件为中心 关心该事件的详细步骤 一步一步如何完成实现.
类和对象
2. 类 只允许单继承 一个类只允许一个父类 没有父类的类称为根类 NSObject 根类 OC里唯一一个没有父类的类
类
:一组具有
相同特征和行为的事物的抽象集合
。 是一个抽象的概念,在生活中不具体.
静态属性 特征 动态属性 动作
对象:类中具体的。对象是类的实例。类的具体表现.
静态类型化 :可以一眼看出对象属于哪个类; 动态类型化:不可以看出继承与哪个类的对象声明方法
类和对象是面向对象的核心。
三大步骤:定义类 ,创建对象,使用对象。
3.OC中类的定义
面向对象编程中使用对象完成程序
开发中:先定义类 ,在创建对象,然后使用对象。
面向对象编程中使用对象完成程序
开发中:先定义类 ,在创建对象,然后使用对象。
定义类包含两部分“:接口部分和实现部分。 分开写 。
1.接口部分:对外声明类的特征和行为 提供外部访问的接口 相当于说明书。 写在 .h文件中
接口部分标志:@interface @end
作用: 声明类的实例变量和方法,即特征和方法
包含内容:类名 父类名 实例变量 方法。
作用: 声明类的实例变量和方法,即特征和方法
包含内容:类名 父类名 实例变量 方法。
(1)以@interface 接口开头
Person 当前类名 :
NSObject
当前类继承的父类
(2)以@end//结束 只有把类的接口定义内容写在开始和结束之间才有效.
(3) People 类名
(4) : 表示继承 后面表示它有父类
(5) NSObject 父类名
2.实现部分:对内实现行为,相当于功能的实现。
实现部分写在.m文件中
(1)以@implementation开头 以@end结束 实现内容必须写在中间才有效 (2)@implementation后的people是要实现的类(需要指定对哪些类实现)
实现部分标志:@
类和文件
类:@interface...@end 文件 @implemention…@end
文件:.h称为接口文件或者头文件 .m称为实现文件。
类和文件
类:@interface...@end 文件 @implemention…@end
文件:.h称为接口文件或者头文件 .m称为实现文件。
默认设置如下:
1.使用类命名文件
2..h文件管理类的接口部分,.m文件管理类的实现部分、
文件和类本质没有关系。为了方便管理实现封装性。
4. 创建对象
创建对象分两步:分配内存空间和初始化
分配内存空间:根据类中声明的 实例变量 为对象分配内存,将所有的实例变量置为默认值0,并返回首地址
初始化:
为对象的实例变量设置初始值。
使用对象
指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作。
Person *p =[Person alloc];先执行”=“ 右侧
1.[ person alloc] 返回值是对象的首地址,即对象。
2.p是跟对象同类型的指针变量,存储对象首地址,代指对象。
1.使用类命名文件
2..h文件管理类的接口部分,.m文件管理类的实现部分、
文件和类本质没有关系。为了方便管理实现封装性。
4. 创建对象
创建对象分两步:分配内存空间和初始化
分配内存空间:根据类中声明的 实例变量 为对象分配内存,将所有的实例变量置为默认值0,并返回首地址
初始化:
为对象的实例变量设置初始值。
使用对象
指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作。
Person *p =[Person alloc];先执行”=“ 右侧
1.[ person alloc] 返回值是对象的首地址,即对象。
2.p是跟对象同类型的指针变量,存储对象首地址,代指对象。
5.实例变量操作
- (CGFloat)getValuea:(CGFloat)a b:(CGFloat)b c:(CGFloat)c;
方法只.h文件中声明 没.m文件中定义实现
解决方法 :在.m文件里实现 或者在.h里删掉
OC中方法调用 采用消息发送机制[receiver message];
[receiver(接收者 是 类(+) 或者 对象(-)) message(消息)];
6. NSLog的定义
NSLog定义在NSObjCRuntime.h中,如下所示:
7. 类和对象
- 对于对象 +对于类
(id) 类似于C语言中的(void *) 泛指指针的返回地址
8. 实例变量可见度 (了解)
public 公共的共有的 实例变量可以在类的外部和内部操作 访问方式可以通过 :对象 + 指向操作符 + 实例变量 例如: p->name;
protected 受保护的 默认的 实例变量只能在该本类和子类内部操作
private 私有的 实例对象只能在该类内访问,不可以在子类文件以及其他文件中访问.
实例变量定义在.h中 相当于先声明某一变量是某一类型的实例变量. 不设置可见度的时候,为默认的 受保护的 protected 定义方式
为什么不声明为@public :1. 外部就可以访问内部以及修改,会影响内部的一个实现,提供外不访问的接口.
2.违背了OC三大面向对象的思想——封装 隐藏内部实现,提供外界访问的借口.
为什么不声明为@private :1.子文件访问不到,子文件还需另外声明.2.违背oc的继承父类有 子类就可以用
@public //单独
NSString *name;//姓名
@private
NSString *gender;//性别
@protected
NSInteger age;//年龄
NSString *name;//姓名
@private
NSString *gender;//性别
@protected
NSInteger age;//年龄
9. 类的定义
接口部分和文件实现部分可以写在main.m里 但需要写在main函数的外面 相当于函数的声明和实现
一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
//.m里
@implementation aa
@end
//.h里
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
//.m里
@implementation aa
@end
//.h里
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
10. 方法
工程 所有单词的首字母都要大写
方法 第一个不大写 以后所有的首字母都大写
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类 当方法是一个减号方法时 调用该方法的对象是谁 self就是当前对象 当方法是一个加号方法时,调用该方法的类是谁 self就代表当前类
加号方法即类方法 只能类使用 不能使用实例变量 实例变量是依托于对象存在的 只有有了对象 实例变量才会有效 这时候还没有实例方法 比如给人个名字 但不知道给那个对象赋名字
加号方法即类方法 只能类使用 不能使用实例变量 实例变量是依托于对象存在的 只有有了对象 实例变量才会有效 这时候还没有实例方法 比如给人个名字 但不知道给那个对象赋名字
unknown type name “women” 意思:不能识别的类型women 解决方案:#import头文件时,会将头文件中的内容复制一份,二档使用women这个类时,该类还未定义,所以识别不了.典型的循环导入问题. 解决方案 :使用该类时不能把它当做一个类来使用,所以在.h文件里使用@Class women;将women声明为一个字符串使用 ,但他不具有类中的内容,需要在.m里面#import “women.h”导入头文件
.n文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
{ //实例变量的存在依托于对象
//NSString字符串的类
NSString *_name;//姓名
NSString *_gender;//性别
NSInteger _age;//年龄
}
//类的方法,即函数的声明,不一样的是oc的方法有对对象的和对类的
//打豆豆
+ (void)fight;//针对与类的方法 不能有实例变量
//sayHi;
- (void)sayHi;
//设置器方法 以set开头的基本形式如下: 都没有返回值 都有参数 为实例变量赋值 只有一个参数
//为name赋值
- (void)setName:(NSString *)name;
//为gender赋值
- (void)setGender:(NSString *)gender;
//为age赋值
- (void)setAge:(NSInteger)age;
//访问器 get方法 都没有参数 都有返回值 给实例变量获取值
//读取_name的值
- (NSString *)name;
//读取_gender的值
- (NSString *)gender;
//读取_age的值
- (NSInteger)age;
//自定义一个初始化方法 - 标识符 对象方法 + 类方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;//实例方法 又称对象方法
//id OC里面所有的返回类型,相当于 void*
//初始化方法的方法名initWhitName:gender:age:中间不能有空格 冒号不能省略
//测试函数
+ (void)test;
@end
@interface Student : NSObject
{
NSString *name;
NSString *sex;
}
@end
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
//一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
@interface Person : NSObject
{ //实例变量的存在依托于对象
//NSString字符串的类
NSString *_name;//姓名
NSString *_gender;//性别
NSInteger _age;//年龄
}
//类的方法,即函数的声明,不一样的是oc的方法有对对象的和对类的
//打豆豆
+ (void)fight;//针对与类的方法 不能有实例变量
//sayHi;
- (void)sayHi;
//设置器方法 以set开头的基本形式如下: 都没有返回值 都有参数 为实例变量赋值 只有一个参数
//为name赋值
- (void)setName:(NSString *)name;
//为gender赋值
- (void)setGender:(NSString *)gender;
//为age赋值
- (void)setAge:(NSInteger)age;
//访问器 get方法 都没有参数 都有返回值 给实例变量获取值
//读取_name的值
- (NSString *)name;
//读取_gender的值
- (NSString *)gender;
//读取_age的值
- (NSInteger)age;
//自定义一个初始化方法 - 标识符 对象方法 + 类方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;//实例方法 又称对象方法
//id OC里面所有的返回类型,相当于 void*
//初始化方法的方法名initWhitName:gender:age:中间不能有空格 冒号不能省略
//测试函数
+ (void)test;
@end
@interface Student : NSObject
{
NSString *name;
NSString *sex;
}
@end
@interface aa : NSObject
{
NSString *name;
NSString *sex;
}
@end
//一个文件里可以有很多个类 只要符合 接口文件的声明和实现的框架就可以 和文件名没有关系 一般情况下 一个文件中就定义一个类 类的名字和文件同名
.m文件
#import "Person.h"
@implementation Person
//打豆豆
+ (void)fight{
NSLog(@"打豆豆");
}
//sayHi;
- (void)sayHi{
NSLog(@"name:%@,gender:%@,age:%ld",_name,_gender,(long)_age);
}
//给name赋值的实现
- (void)setName:(NSString *)name{
_name = name;
}//规范的写法 _name 实例变量前加_ + 变量名
//为gender赋值
- (void)setGender:(NSString *)gender{
_gender = gender;
}
//为age赋值
- (void)setAge:(NSInteger)age{
_age = age ;
}
//读取_name的值
- (NSString *)name{
return _name;
}
//读取_gender的值
- (NSString *)gender{
return _gender;
}
//读取_age的值
- (NSInteger)age{
return _age;
}
//自定义一个初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
_name = name;
_gender = gender;
_age = age;
return self;
}
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类
//测试函数
+ (void)test{
}
@end
#import "Person.h"
@implementation Person
//打豆豆
+ (void)fight{
NSLog(@"打豆豆");
}
//sayHi;
- (void)sayHi{
NSLog(@"name:%@,gender:%@,age:%ld",_name,_gender,(long)_age);
}
//给name赋值的实现
- (void)setName:(NSString *)name{
_name = name;
}//规范的写法 _name 实例变量前加_ + 变量名
//为gender赋值
- (void)setGender:(NSString *)gender{
_gender = gender;
}
//为age赋值
- (void)setAge:(NSInteger)age{
_age = age ;
}
//读取_name的值
- (NSString *)name{
return _name;
}
//读取_gender的值
- (NSString *)gender{
return _gender;
}
//读取_age的值
- (NSInteger)age{
return _age;
}
//自定义一个初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
_name = name;
_gender = gender;
_age = age;
return self;
}
//self 谁调用该方法,self就代表谁 可用于对象 也可用于类
//测试函数
+ (void)test{
}
@end
main.m文件
#import
<Foundation/Foundation.h>
#import "Person.h"
#import “mobilePhone.h" 头文件的导入
int main( int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[ Person alloc ] init ]; // 开辟空间 初始化
[p sayHi ]; // 对于对象的方法实现
[ Person fight ]; // 对于类的方法实现
Person *xiaoMing = [[ Person alloc ] init ]; // 开辟内存 , 并初始化
[xiaoMing setName : @"duke" ]; // 字符串对象 需要 %@ 输出
[xiaoMing setGender : @"female" ];
[xiaoMing setAge : 20 ]; // 就是个简单地变量类型
[xiaoMing sayHi ];
Person *xiaoli = [[ Person alloc ] initWhitName : @"frank" gender : @"m" age : 18 ]; // 调用初始化方法 自定义的
[xiaoli sayHi ];
}
return 0 ;
}
#import "Person.h"
#import “mobilePhone.h" 头文件的导入
int main( int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[ Person alloc ] init ]; // 开辟空间 初始化
[p sayHi ]; // 对于对象的方法实现
[ Person fight ]; // 对于类的方法实现
Person *xiaoMing = [[ Person alloc ] init ]; // 开辟内存 , 并初始化
[xiaoMing setName : @"duke" ]; // 字符串对象 需要 %@ 输出
[xiaoMing setGender : @"female" ];
[xiaoMing setAge : 20 ]; // 就是个简单地变量类型
[xiaoMing sayHi ];
Person *xiaoli = [[ Person alloc ] initWhitName : @"frank" gender : @"m" age : 18 ]; // 调用初始化方法 自定义的
[xiaoli sayHi ];
}
return 0 ;
}
11 . 继承
继承的思想:当多个类出现部分相同的实例变量和方法时,就考虑用继承 .
继承的使用:将多各类中相同的实例变量的方法提出来写成一个公共父类.
子类继承父类:会将父类中中除了声明为@private的实例变量以及私有方法之外,其他内容会继承.如果子类中有父类相同的内容,可以全部删除. 父类继承过来东西就是自己的 不是父类的 相当于拷贝过来一份 可以直接来用
私有方法:在.m中实现,但是没有在.h中声名的方法 不允许外部访问,本类内部可以访问
使用私有方法的方式 [self aa];
私有方法:在.m中实现,但是没有在.h中声名的方法 不允许外部访问,本类内部可以访问
使用私有方法的方式 [self aa];
12.消息发送机制 [receiver message]; 这里receiver可以使类 也可以是对象 如果message是+号方法 这里就是类 如果是- 号方法这里是对象
13.OC里的id泛指搜友的对象类型 可以用对应的对象类型来接收
14.创建对象分两步:首先在堆区开辟内存空间,然后对空间对象赋初值 如定义一个Person类 首先[Person alloc];开辟内存空间 然后将变量赋初值操作
Person *per = [[Person alloc] initWithName:@"frank" sex:@"man" age:18];
调用方法 [per sayhi];’[接收者 message];