OC完整总结

本文深入探讨Objective-C这门编程语言,从基础语法到高级特性,包括类、消息传递、内存管理、Category、协议与委托等核心概念,旨在为开发者提供全面的理解。
摘要由CSDN通过智能技术生成

面向过程的编程(procedure-oriented programming,POP:以事件为中心,关心完成事件的详细步骤,一步一步如何实现)

面向对象的编程(Object Oriented programming,OOP,以事物为中心,也就是参与事件的参与者,设计事物的功能,而完成事件只是所有功能中的一个小功能)

简单的说就像人吃饭,面向过程就是人怎么去吃饭(用筷子啊,清蒸啊,红烧啊等等),面向对象就是以人为基准(人能 吃喝拉撒睡等)以饭为基准(饭有 米饭面条海鲜各种不同做法等),人怎么去吃饭只是所有功能的一部分

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

类是一个抽象的概念生活中不具体

对象:是类的实例 也就是类的具体表现 生活中的万物都是对象

描述一个类:  通过特征(静态属性)行为(动态属性)

@是OC的标志

 类的定义分为两部分,:

 1:类的接口部分,提供外部访问的接口相当于使用说明书

 2:类的实现部分详单与功能的实现

类的接口部分写在 .h 文件中

 接口部分的定义:(1)以@interface开始 以  @end结束,只有把类的接口定义内容写在之间才有效

 (2)Person 类名.

 (3) : 号表示继承. 表示他有父类

 (4)NSObject父类名

实例变量  类似于结构体中的结构体成员,必须写在大括号内,而且大括号内只能写实例变量

NSString相当于c语言中的定义字符串char a[20]
NSInteger相当于C语言中得 int;

-(void)sayhi;//方法名 sayhi , - 号的意思是 由 对象调用的方法, + 号则表示是由类调用的方法.

类的实现部分 写在.m 文件中

 类的实现部分:(1)  写在@implementation  和  @end之间才有效

 @implmentation 后的Person是要实现的类(需要指定对哪一个类实现)

方法调用采用  消息发送机制[receiver(接收者,类 或 对象)   message(消息,方法)]

如何区分是给类还是对象发送消息      [- 开头是给对象发送的, + 开头是给类发送的]

创建对象分两步:

1 . 开辟空间.alloc 方法加号方法

通过[person alloc] 在堆区开辟的空间才是真正的对象,只不过对于指针变量per存储的首地址,通过它才能访问对象,所以我没问你把指针变量per叫做对象(但真正的对象是堆区空间per本质是指针变量)

id 可以代表所有的对象类型 ,可以用对应类型的对象来接收

Person *per =  [Person alloc];

2 . 初始化  init 放法完成初始化操作 减号方法,对象调用

per =  [per init];

- (id)initWithName:(NSString*)_name price:(NSInteger)_pricecolor:(NSString *)_color;

由自己定义的初始化方法,给自己的每个实例变量赋初值

 [per sayhi]; 由对象调用方法.


1.实例变量的可见度:一共有三种
    @public:公共的,在任何文件中都可以访问,(访问方式是通过对象+指向操作符 + 实例变量,例如:per->name)
    @protected:受保护的,有一定的访问权限,只允许在本类文件以及子类文件中访问,其他文件不可以访问
    @private:私有的,只允许在本类文件中访问,不可以在子类文件以及其他文件中访问
    默认的可见度是:@protected
    为什么不声明为@public?
    (1).声明为:@public 实例变量,外部可以访问以及修改,会影响到内部的一个实现,暴漏实现细节
    (2).违背oc面向对象的三大特性之一:封装.(封装的思想是隐藏内部的实现,提供外接访问的接口)
    为什么不声明为@private?
    (1).声明为:@private的实例变量,子类文件访问不到,所以子类文件还需要重新定义声明.
    (2).违背了oc面向对象的特性之一:继承 (父类有的东西,子类也有,可访问)
2.设置器 setter方法 与访问器 getter方法  的运用
3.文件和类的关系:文件和类没有直接关系,文件可以存放多个类,只要类符合接口部分和实现部分的定义格式就可以.但一般情况下,一个文件就定义一个类.
4.self的使用:谁调用该方法,self就代表谁.
    当方法是一个 - 号方法时,调用该方法的对象是谁,self就代表当前对象
  当方法是一个 + 号方法时,调用该方法的类是谁,self就代表当前类
5. + 方法中不能使用实例变量,实例变量是依托于对象存在的,只有有了对象,实例变量才会有空间.
6.循环导入问题:当导入头文件时,相当于把里面东西都复制一份,而当使用这个类时,这个类还没定义,因此,不能识别.
  解决方案:在.h文件中使用@class,将类声明为一个字符串,但是它不具备类中的内容,因此,需要在.m文件中再将头文件导入即可.


1.通过作业题,讲了OC中的”继承”,通过多个类总结出来父类(通过相同的特点和行为),然后使用继承可以简化很多代码
2.再使用继承的时候,子类继承父类会将父类中除了声明为@private的实例变量和私有的方法之外的其他全部内同都会被继承.如果子类中有和父类中同样的内容,全部删掉保留自己独有实例变量,不然会引起重复定义的错误,当然这是指实例变量(私有方法:就是在.m文件中实现了,但是没有在.h文件中声明的方法,这类方法不允许在外部访问,可以在本类中访问.)
3.在子类中,如果方法和父类相同了,不会出现错误,因为,继承的时候可以重写父类的方法,这个时候会出现三种情况:①保留父类对该方法的实现,不重写方法,这是上面遇到的情况;②按子类重写之后的方法来实现.(实现方式,重写该类方法,写自己的实现体,完全忽视父类的实现);③对于该类方法既有父类对该方法的实现,也有子类对该方法的实现,这儿用到一个重要的关键吃super
4.super的作用:用来调用父类对该初始化方法的实现.而self用来调用自己的方法
5.自定义初始化在实现的时候,本类中只对自己独有的实例变量赋值即可,然后父类中有的可以通过super调用实现简化
6.便利构造器:①作用是快速创建对象,内部封装了创建对象的过程;②格式:⑴ + 号方法 ⑵返回值类型为 id 类型 ⑶以类名+with开头,拼接上多个参数(便利构造器与标准创建对象相比便利不了多少,而且占内存,一般情况下不建议使用)




1.创建对象  
两种方式:(1)便利构造器(+号方法)  
        (2) 初始化方法  
        (3)根据字符串初始化OC字  
           符串对象(已弃用)   
2.求字符串长度  
3.获取字符串中的某个字符  
给定的字符下标超出范围,即下标越界时,程序会crash  
问题产生的原因.NSCFString == NSString ,又是一个- 号方法,所以问题产生的原因是:让一个NSString类型的对象,调用characterAtIndex:方法时,给定的字符下标超出范围,即下标越界  
解决方案将数组下标修改范围之内即可.  
4.判断是否已指定字符串开头,或者以指   
定的字符串开头  
注它可以判断字符串的开头和结尾是  
   否是已指定的的  
5.查找指定字符串的范围(可以找出已  
知字符串中的某段字符串内容)  
6.字符串的截取 有三种方式  
  (1)获取给定下标之后的子串,包含指  
     定下标对应的字符  
  (2)获取给定下标之前的字串,从下标  
     为0开始,但不包含指定下标对应的字符  
  (3)获取指定范围内的字符串.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值