本次是OC的第一节课,主要是学习和理解类与对象

1、面向对象

 1> OOP(Object Oriented Programming)面向对象编程。

 面向对象以事物为中心,完成某件事情都需要哪些事物来参与,参与该事件的事物都有哪些功能,完成该事件需要这些事物相互协作共同完成,并且完成该事件只是所有事物功能中其中的⼀个⼩功能。

 2> 面向对象与面向过程的区别

 3> 面向对象优点

  面向对象具有良好的可扩展性和重用性。

  面向对象可以降低我们代码的耦合度,提高代码的可移植性。

  面向对象接近于日常生活和自然的思考方式,可以提高我们软件开发的效率和质量

 4> 面向对象编程

  面向对象编程的核心是转变考虑问题的方式。当我们看到一个问题的时候,我们不需要再考虑完成该事件需要怎样的步骤,而是考虑完成该事件都需要哪些对象(事物)参与,每一种事物都有哪些特征和行为。完成相应的事件需要不同的事物根据自身的行为,协调完成该事件。

2、OC概述

 1> OC语言的特点

  C语言的超集,允许在OC中使用C语言代码,编译器兼容C语言程序

  具备完善的面向对象特性:封装、继承、多态。

  包含一个运行时系统。

  类库丰富。

 2>OC与Swift

  Objective-C和Swift虽然语法上差异很大,但是背后的思想以及所依托的类库都是相同的。

3、类和对象的概念和区别

 1> 类:具有相同特征和行为的事物的抽象

 2> 对象:类的实例,万事万物皆是对象

4、类和对象的定义

 1> 类的定义

  面向对象的核心思想是类和对象。

  OC中类的定义分为两个部分:接口部分和实现部分。

  接口部分:对外声明类的特征和行为。(.h文件中)

  实现部分:行为的具体实现。(.m文件)

 2> 接口部分

 #import <Foundation/Foundation.h>

 @interface Person : NSObject
{
// 声明实例变量
NSString *_name; // 姓名
int _age; // 年龄
NSString *_sex; // 性别
double _height; // 身高
NSString *_hobby; // 爱好
} // 吃饭
- (void)eat; // 睡觉
- (void)sleep; // 学习
+ (void)study; @end

   @interface和@end成对出现,表示类的接口部分(声明部分)

  用来声明类的实例变量(特征)和方法(行为)

  Person表示类名

  : 表示继承关系 : 后面的类名表示父类名

  NSObject 基类

  ① 实例变量

   代码5-10行,声明实例变量必须在大括号{...}中

   OC中的类型,声明实例变量的时候后面加 *

   C语言中的基本数据类型,类型后面不加 *

   实例变量的命名规则:以下划线 '_' 开头(书写规范), 首字母小写,遵循驼峰命名法

  ② 定义方法

   OC中的方法分为两类

    第一种:'+' 号方法(类方法),由类名调用

    第二种:'-' 号方法(对象方法或实例方法),由对象调用

 3> 实现部分

 #import "Person.h"

 @implementation Person

 // 吃饭
- (void)eat {
NSLog(@"吃");
} // 睡觉
- (void)sleep {
NSLog(@"睡");
} // 学习
+ (void)study {
NSLog(@"好好学习,天天向上");
}
@end

  @implementatiom和@end成对出现,类的实现部分  

  实现Person类中定义的方法

  Person 表示类名

 4> 对象的创建

  类是一个抽象的概念,在实际开发中程序的运行时通过对象间的相互协作来完成

  对象是类的实例,通过类来创建对象

 int main(int argc, const char * argv[]) {
@autoreleasepool {
// 第一种
// 申请存储空间
Person *p1 = [Person alloc];
// 初始化p1对象
p1 = [p1 init]; // 第二种(常用)
// 消息嵌套机制
Person *p2 = [[Person alloc] init]; // alloc 申请存储空间,init 初始化对象 // 第三种
// new 等同于 alloc 和 init
Person *p3 = [Person new]; // OC中使用 [] 给方法发送消息
[p2 eat]; // 使用对象名调用对象方法
[p2 sleep];
[Person study]; // 使用类名调用类方法
}
return ;
}

  创建对象

   ① 定义类

   ② 开辟存储空间

   ③ 初始化

  上面的代码中有三种方式,一般在工程中使用第二种

  开辟空间

   + (instancetype)alloc;

   '+' 表示方法是类方法,只能由类调用。instancetype返回值类型,可以用id(任意对象类型)替代

  初始化

   - (instancetype)init;

   '-' 表示对象方法,对象调用。instancetype返回值类型,可以用id(任意对象类型)替代

 5> 区别id和instancetype

  ① id和instancetype都可以作为方法返回值类型,都表示任意类型的对象

  ② instancetype可以返回和方法所在类相同的对象,id只能返回未知的类型

③ instancetype只能作为方法的返回值或参数类型,id不仅可以作为返回值类型,还可以用来作为定义变量的类型

④ 在init方法中,id和instancetype作为返回值类型是没有区别的

5、实例变量的可见度

 实例变量可见度分别是:@public@protected@private,@package 

  @public 修饰的变量 在任何地方都可以直接访问对象的成员变量

  @private修饰的变量 只能在当前类的对象方法中直接访问

  @protected修饰的变量 能在当前类和子类方法中直接访问

  @package修饰的变量 只要处于同一个框架中就能直接访问对象的成员变量

 外界想要访问对象实例变量,实例变量需要通过@public修饰。

 在 .h 文件中实例变量没有指定可见度的情况下,默认是 @protected

 在 .m 文件中实例变量也可以被定义,可见度是 @private

 三种可见度的区别

5、方法

 1> 方法分类

 方法分为对象方法和类方法

  对象方法 以减号 - 开头, 只能由对象调用,对象方法中能访问成员变量(实例变量)

  类方法 以加号 + 开头, 只能由类(名)来调用, 类方法中不能访问成员变量(实例变量)

 2> 方法名

 // _isMarried的getter方法
// 方法名:isMarried
- (BOOL)isMarried;
// _isMarried的setter方法
// 一个参数方法名setIsMArried:
- (void)setIsMarried:(BOOL)isMarried;
// 多个参数方法名:setHoddy: weight: address: isMarried:
- (void)setHoddy:(NSString *)hoddy
weight:(double)weight
address:(NSString *)address
isMarried:(BOOL)isMarried;

方法名的确定请参考以上代码

6、setter和getter方法

 实例变量如果是受保护类型的,外界无法直接访问,外界如果要访问实例变量,需要本类提供方法,外界访问的话直接调用相应的方法即可  

 1> 外界操作实例变量通常对实例变量赋值和取值操作

  setter方法:本类提供的用来给实例变量赋值的方法

  getter方法:本类提供的用来给实例变量取值的方法

 2> 方法命名

  setter方法:以set开头,后面跟上实例变量名(没有下划线)

  getter方法:实例变量名去掉下划线 _

以下是一个较完整的类定义的代码

Goddess.h

 #import <Foundation/Foundation.h>

 @interface Goddess : NSObject
{
// 声明实例变量 // 实例变量没有指定可见度的情况下,默认是@protected
NSString *_speciality; // 特长 @public // 公共的
NSString *_name;// 姓名
int _age; // 年龄 @protected // 受保护的 外界无法访问,可以被子类继承
NSString *_hoddy; // 爱好
double _weight; // 体重 @private // 私有的 外界无法访问,不可以被子类继承
NSString *_address; // 地址
BOOL _isMarried; // 是否已婚
}
// _hoddy的setter方法
- (void)setHoddy:(NSString *)hoddy; // _hoddy的getter方法
- (NSString *)hoddy; // _weight的setter方法
- (void)setWeight:(double)weight; // _weight的getter方法
- (double)weight; // _address的setter方法
- (void)setAddress:(NSString *)address; // _address的getter方法
- (NSString *)address; // _isMarried的setter方法
- (void)setIsMarried:(BOOL)isMarried; // _isMarried的getter方法
- (BOOL)isMarried; // 定义多参的方法
// 方法名:setHoddy: weight: address: isMarried:
- (void)setHoddy:(NSString *)hoddy
weight:(double)weight
address:(NSString *)address
isMarried:(BOOL)isMarried; @end

Goddess.m

 #import "Goddess.h"

 @implementation Goddess

 // _hoddy的setter方法
- (void)setHoddy:(NSString *)hoddy {
_hoddy = hoddy;
} // _hoddy的getter方法
- (NSString *)hoddy {
return _hoddy;
} // _weight的setter方法
- (void)setWeight:(double)weight {
_weight = weight;
} // _weight的getter方法
- (double)weight {
return _weight;
} // _address的setter方法
- (void)setAddress:(NSString *)address {
_address = address;
} // _address的getter方法
- (NSString *)address {
return _address;
} // _isMarried的setter方法
- (void)setIsMarried:(BOOL)isMarried {
_isMarried = isMarried;
} // _isMarried的getter方法
- (BOOL)isMarried {
return _isMarried;
} // 定义一个多参的方法
- (void)setHoddy:(NSString *)hoddy
weight:(double)weight
address:(NSString *)address
isMarried:(BOOL)isMarried { _hoddy = hoddy;
_weight = weight;
_address = address;
_isMarried = isMarried;
} @end

iOS学习10之OC类和对象的更多相关文章

  1. iOS学习之Object-C语言类和对象

    一.OC语言的特点:封装,继承,多态:包含一个运行时系统:类库丰富. 二.面向对象      1.概述      OOP(Object Oriented Programming)面向对象编程.     ...

  2. 【IOS学习基础】OC类的相关

    几天前突然在别人的类的.m文件中看到这么一句代码:@synthesize xxxx = _xxxx; 当时愣是没理解啥意思,过后才缓过神来发现原来是把一些类的基础知识忘记了,虽然不用过多去深究以前的一 ...

  3. iOS学习19之OC类的扩展

    为一个类扩展功能:1.子类化:2.修改源代码:3.定义协议:4.Category:类目 1.Category 1> Category的作用 Category:也叫分类,类目,是为没有源代码的类扩 ...

  4. IOS学习之路--OC的基础知识

    1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouc ...

  5. iOS RunTime运行时(1):类与对象

    Objective-C语言是一门动态语言,他将很多静态语言在编译和链接期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码更具有灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一下 ...

  6. iOS学习16之OC集合遍历和数组排序

    1.集合遍历 1> 遍历 集合(Collection):OC中提供的容器类:数组,字典,集合. 遍历:对集合中元素依次取出的过称叫做遍历. 三种方式:① for循环遍历: ② NSEnumera ...

  7. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  8. [javase学习笔记]-6.2 类与对象的关系

    这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. ...

  9. iOS学习笔记43-Swift(三)类

    一.Swift的类class 作为一门面向对象语言,类也是Swift的非常重要的类型,我们先来看下一个简单的类 //Swift中一个类可以不继承于任何其他基类,那么此类本身就是一个基类 class P ...

随机推荐

  1. Xcode常用代码块

    Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带来很大的方便. 常用的: 1.strong:@property (nonatomic,stron ...

  2. WebService - 怎样提高WebService性能 大数据量网络传输处理

    直接返回DataSet对象 返回DataSet对象用Binary序列化后的字节数组 返回DataSetSurrogate对象用Binary序列化后的字节数组 返回DataSetSurrogate对象用 ...

  3. Linux中exec()执行文件系列函数的使用说明

    函数原型: 描述:    exec()系列函数使用新的进程映像替换当前进程映像.    工作方式没有什么差别, 只是参数传递的方式不同罢了. 说明:    1. 这6个函数可分为两大类: execl( ...

  4. js继承的概念

    js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js ...

  5. C#在excel中添加超链接

    1.新建一个项目 2.给项目添加引用:Microsoft Excel 12.0 Object Library (2007版本) using Excel = Microsoft.Office.Inter ...

  6. JS获取form表单的所有输入值

    function getFormQueryString(frmID) { var frmID=document.getElementById(frmID); var i,queryString = & ...

  7. Liunx-https-java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b

    错误信息: java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b at javax.crypto.KeyGenerator.a(DashoA13* ...

  8. visio调整画布大小和旋转画布(转)

    1.调整画布大小: 鼠标移至画布边界(注意不能是顶点附近),按下ctrl,就会出现双向箭头,拖动鼠标即能调整画布大小. 2.旋转画布: 鼠标移至画布顶点或附近,按下ctrl, 出现单箭头优弧,移动鼠标 ...

  9. HDU 5213 Lucky 莫队+容斥

    Lucky Problem Description WLD is always very lucky.His secret is a lucky number K.k is a fixed odd n ...

  10. 内核函数KiFastCallEntry

    KiFastCallEntry() 机制分析 概述 Win32 子系统 API 调用 ntdll!ZwWriteFile() 函数 ntdll!KiFastSystemCall() 函数 _KUSER ...