OC课程笔记总结2-面向对象

课程:面向对象

1.面向对象思想:

面向对象OO思想是解决问题的一种思想。面向过程PO(c)也是解决问题的一种思想。

面向过程关注的是具体的步骤,而面向对象关注的是对象,解决这个问题需要什么对象,需要多少个对象。

面向对象只要找到或是创建出相关的对象,即可完成一些功能。核心是对象。

如何创建出相关的对象?通过类,进而创建相关对象。类是抽象的,对象是具体的。

在实际开发中,首先分析需要哪些类,进而设计类,然后创造出实际对象。设计一个类,需要关注类名,属性,行为这三大点。行为即功能,功能由函数实现。

类名首字母大写,驼峰写法,并且不能有下划线。

属性名首字母小写,驼峰写法。


2.类和对象

在OC中写一个类,必有类的声明和类的实现。类似函数一样,函数的声明和定义。

类的声明:用@interface 类名:NSObejct  {。。。。。。。。。}@end(表明当前类声明完毕),冒号表示继承,NSObject是超类存在于Foundation框架中。。

然后声明这个类对象的属性和行为:属性即成员变量,也叫实例变量,行为即方法,方法与函数类似,但不等于函数。 

类的实现:@implementation 类名{。。。。。。。。。。}@end(表明类的实现完毕)。

在OC中想做任何操作都先写一个中括号[]并以;分号结束,操作是一个语句,语句必须用分号结束:[];

在中括号中写上要做的行为。

[行为执行者 行为名称]  表示谁执行,执行什么行为。例如

[类名 new] :new 是一个行为,即创建一个对应类名的新对象,之后会返回一个对象本身,即对象地址,必须使用一个对象指针接收地址。

类名 *p=[ 类名 new];

每次new都会创建一个新对象。

在OC中,只能通过指针变量来间接操作对象和修改对象。必须先定义一个指针变量指向对象。指针获得地址之后,用->号来进行对对象的操作和修改。

默认的属性是@protected的,可以使用@public来修饰属性,让指针可以访问内部的属性。

对象的方法:方法和函数都有三要素:方法名,参数,返回值。

方法也需要声明和实现,同样适用关键字@interface来声明方法,使用关键字@implementation来实现方法。

而OC对象的方法,必须以-号开头,OC方法中任何数据类型都必须用小括号括住,例如返回值也是数据类型,也必须用小括号扩住,在OC方法中,小括号的唯一作用就是括住数据类型。

所以当参数为空时,方法名之后不要跟空的小括号,因为小括号只能用来括住数据类型。

类的实现就是类方法的实现,即定义明确的方法语句。而要调用方法,在OC中只能通过指针去调用,并且调用方法是执行一种行为,行为即方法,需要使用到中括号

在OC中的消息机制:即给指针指向的对象发送一条消息,让其执行某个行为。


方法与成语变量(属性):

在声明一个类时,成员变量必须在大括号内声明,而方法必须在大括号外声明,最后以@end作为类声明的结束。在声明方法时,只要出现数据类型都必须用小括号括住,而void也是一种数据类型。并且声明方法

时也必须以-号开头,如果是空参数,不能用空的小括号()。

声明了属性后,属性都会有默认初始值。

类继承了什么类只需要在声明时说明,在实现是不用再次声明。并且类的实现就是具体定义类中的方法。

在实现方法是,方法可以访问自身类的属性。谁调用,就访问谁的属性,调用方法的只能是实例对象。


对象在内存中的细节:

实例对象会占据内存空间,而类本身也会占据内存空间,对象有多个,会占据多份内存空间,类只有一个,只占一份内存空间,

在第一次使用类来创建第一个对象时,将类加载进内存,首先分配空间给类,在分配空间给对象。

在类所占的内存中,只会存放方法列表。方法列表会存放所有该类的方法的声明,而在每一个内部,都默认有一个指针,isa指针,这指针指向该对象所属的类,可以获得这个类的方法列表,

即实现了方法共享。

那类的方法存放在哪里呢???存放在方法区中吗??


对象与函数参数的细节:

在OC中,方法和函数有着本质的差别,并不能等同。即方法用-号开头,而函数与在C中定义的一样。在函数中,要分清是值传递还是地址传递,并且调用函数时会分配内存空间给函数,以及函数的形参变量,

当函数调用完成后,会释放函数的所占的内存。所有在这个函数内部的变量(除了static外),都会释放,但是!!!!在函数内部所创建的对象并没有释放,因为在OC中,对象是不会自动回收的(新版本是否会自动回收??)

释放的只是变量而言,对象内存空间不会自动释放。除非手动释放或是main函数执行完毕,程序结束,这样对象内存才会回收。

而执行方法是会有什么不同呢?????


要完整的描述一个类,必须有声明和实现,声明和实现的关系是:声明是手表表面,实现是手表的内部构造。

声明是将类的有哪些属性,有哪些方法展示出来,而表明看不到这些方法的具体定义,而实现是具体的定义方法。


常见的错误:

@interface和@implementation不能嵌套,方法的实现只能现在@implementation中,方法声明也只能写在@interface中,

声明方法只能写在大括号外面,@interface和@implementation和@end都是配对的。类的属性都是成员变量,只能是有对象的情况下才能存在。

在声明成员变量时时不允许赋值的,每个成员变量都有默认初始值,要给成员变量赋值,只能通过指针操作,不能将成员变量当成

c中的变量来看待。有内部函数,static函数,但是没有内部方法。创建对象是必须先声明类,因此编写代码的顺序是很重要的,OC的编译器和c

一样,是完全按顺序执行的,因此类的声明一定要写在创建对象之前,但是实现不用一定写在前面。和c中函数一样。


OC中方法和函数的区别:

方法只能写在类的实现中,声明必须写在@interface的大括号和@end之间,实现写在@implementation和@end中,而函数可以写在main函数中,方法用-号开头,函数和c中一样,

函数和方法是有本质区别的,方法名和函数名可以同名,但对象方法只能有对象调用,方法是属于对象的,而函数是属于文件的,可以写在文件中的任意位置,除了方法声明中,

但是放在方法实现内部,一样可以调用函数,当定义在方法实现中时,即使没有创建对象,仍然可以调用函数。

有方法的声明,就必须有方法的实现???是否一定要配对???


类的合理设计:

在实际开发中,要使用枚举类型是一般都配合typedef使用

typedef enum {枚举固定取值(都是常量名)} 别名;对于定义枚举中的常量名,一般以枚举类型开头,或是k(小写)+枚举类型开头,k表示常量的意思。

即:枚举常量名=k枚举类型名枚举常量名。便于阅读,是良好的书写习惯,这样在阅读代码时就可以根据枚举常量名知道这个常量是哪一个枚举类型了。

可以参考APPLE官方书写规范。

同时还经常配合结构体使用,用结构体定义基本数据类型的属性。用枚举定义枚举类型 的属性,但是注意在给结构体变量赋值时,如果想要一次性全部赋值,只能是在定义结构体变量的

同时才能完成,注意是声明变量,而不是定义结构体类型,之后如何要给结构体变量赋值,只能是对结构体中的每个变量单独进行赋值操作。访问结构体中的变量使用:结构体名.变量名,使用”。“点号访问

而箭头用于访问对象的属性,不要搞混。

对象的成员变量可以是任意类型。基本数据类型,枚举类型,结构体类型,或者是其他对象类型,都可以。对于类型是对象的属性,赋值时只要通过地址传递即可完成。

而对象的方法中也可以调用其他对象的方法。而调用方法即完成某个行为,在oc中格式如下:[对象 对象方法];


方法的声明和实现:

类和类可以有联系,例如可以一个类包含另一个类,对象和对象也可以有联系。一个类可以没有任何属性。

有参数的方法的声明和实现:方法名后加入参数,在OC中,凡是出现数据类型都要用小括号括起来,但是小括号只括数据类型,不括住变量名,这点要注意

例如:- (int)pingfang (int) num;这句是正确的声明,而- (int)pingfang(int num);是错误的声明,因为小括号把参数名也括住了,是错误的。

对于参数是其他类对象的,参数类型为指向那个类的指针,指向类的指针只是表示一种类型,而传入的参数指针实际上是指向那个类的某个对象的指针,因为在定义方法是没有创建对象,因此用指向类的指针作为参数

而不是用指向对象的指针作为参数。

如果是结构体类型,枚举类型,等等自定义类型也要有小括号括起来吗????????????????????????

另一个注意点是,在每一个参数的前面加上冒号,一个冒号对应一个参数,有多少个参数有多少个冒号,并且冒号是写在参数类型名之前,多个同类型参数不能省略类型名。

写冒号的作用是为了让编译器识别方法名称是到哪个字符结束,多个参数名 用冒号隔开也是为了让编译器识别各个参数的参数名,在调用方法传入参数时,也使用冒号隔开。

但在实际开发中,不使用这样的写法,因为在传入参数时不知道参数的作用,因此在实际开发中,编写方法名是可以定义得非常详细,非常长,而编写参数名时同样也是编写的

很长很详细,方便在传入参数时就明确知道这个参数的实际作用,可以在参数的冒号之前写详细的参数描述,在调用是使用tab键可以很方便。在上一个参数和下一个参数的描述信息

之间用空格隔开,在传入参数时也要写空格。

冒号也是方法名的一部分,一定要注意这一点,所有的冒号和冒号之前的描述信息都是方法名称,所以方法名非常的长。其实方法在编程软件中可以方便的查找到。

带有参数的方法的方法名最后一定是以冒号结尾。在官方代码编写规范指南中也建议这样编写代码。


匿名对象,在实际中比较少使用,看懂即可。格式如下:

[类名 new]->属性;调用属性。

[[类名 new] 方法];  中括号内在嵌套中括号,用于调用方法。

以上是两个对象,不是一个对象,笔试会有类似题目分析。

每次new都会创建一个新对象,如果是匿名的,在一个匿名对象创建后是不会自动回收内存的,但是在创建一个匿名对象后,访问的则是新的匿名对象。

开发中不使用匿名对象,因为匿名对象会造成内存泄漏。


学习方法:一定要自己去阅读苹果的官方文档,全英文,可以在xcode软件中获得。要学会自己查找框架的自带类,掌握自带类的功能。

要注意代码规范,并且一定做好注释,命名一定要方便阅读,不要在乎命名长度,越详细越好。该有空格的地方一定要用空格隔开。严格要求自己才能做得更好,不要偷懒,编码规范与世界接轨。

在使用if语句判断条件后并返回值的,可以简写成为一句return语句,这样写可以简化代码,但是代码阅读性并未降低。


































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值