------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.类方法描述
Objective-C中的类可以声明两种类型的方法:实例方法和类方法。
实例方法就是在一个类的具体实例范围内调用。也就是说在使用实例方法时候,必须先创建一个类的实例。
类方法不需要事先创建一个实例。
类方法开头是+表示,它不依赖于实力对象。
2.类方法调用
【类名 方法名】;
类方法可以与实例方法同名。实例方法由实例对象访问调用,类方法要通过类里访问调用,不会有交叉相互影响。
类方法也可以是从父类继承而来,子类可以重写类方法。
类方法和实例方法一样在interface里声明,在implementation里实现。
类方法只能被类调用执行,向实例对象发送类方法是不能被触发执行的。
在类方法里使用了self,这个self执行的类对象class object而不是实例对象instance object。
3.类方法的有点:
- 节省内存空间
- 提高效率
- 作为工具方法
注意:在类方法中,不能调用类的成员变量。在对象方法中可以使用类的成员变量。
4.类方法和对象方法比较
1)对象方法:
以-号开头
可以使用成员变量。用对象调用对象方法
对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)。对象方法可以调用类方法。
2)类方法:
以+开头
不可以使用成员变量
用类名调用类方法
类方法可以调用对象方法(是通过将对象作为参数传入方法)
类方法不可以调用自身,会造成死循环。
5.类方法的应用
如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法。
@interface Calculator : NSObject
{
int_result;
int_num1;
int_num2;
}
//声明一个类方法用于计算两个数的和
+(int)sum Num1:(int)num1 andNum2:(int)num2;
@end
@implementation Calculator
//通过类方法计算两个数的和
+(int)sumNum1:(int)num1 andNum2:(int)num2{
return num1+num2;
}
@end
6.封装的概念
当一个类把自己的属性暴露给外部的时候,那么该类就失去对属性的管理权。
将数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不可被外部任意存储是面向对象设计本质。降低了数据被无用的可能性!
在OC语言中,使用@interface和@implementation来处理类。
@interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。
实例变量默认只能被当前类的对象方法访问。
封装的实现步骤:
定义设置实例变量(setter)方法和访问实例变量(getter)的方法,也称设置器和访问器。
setter 设置器:
在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、@protected等关键字修饰,
而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可以对一些不合理的赋值进行筛选过滤。
Set方法的作用:为外界提供一个设置成员变量值的方法。
命名规范:
(1)方法名必须以set开头
(2)Set后面跟上成员变量的名称,首字母大写
(3)返回值一定是void
(4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致
(5)形参名不能和成员变量名一样(苹果官方推荐成员变量名前加_以示区分)
Set方法的好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤
@interface Person :NSObject{
int _age;
}
-(void)setAge:(int) age;
@end
set方法的实现
@implementation
-(void)setAge:(int)age{
_age = age;
}
@end
getter访问器:
Get方法的作用:为调用者返回对象内部的成员变量。
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
@interface Person:NSObject{
NSString * _name ;
}
-(NSString *)name;
@end
get方法的实现
@implementation
-(NSString *)name{
return _name;
}
@end
(1)在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取,
但是不允许修改的情况,则通常只提供get方法而不提供set方法。
(2)成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:
(1)与get方法的方法名区分开来;(2)可以和一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。
7.组合模式
把具有相同基类类型的对象组合到树形结构中,以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式使得树形结构中的每个节点都具有相同的抽象接口,整个结构可作为一个统一的抽象结构使用,而不暴露其内部表示。
每个节点的任何操作,可以通过抽象基类中定义的相同接口来进行。
在Cocoa Touch框架中,UIView对象被组合成一个树形结构,UIView对象可以包含其他的UIView对象。
这种组合方式便于统一用于事件处理和动作消息,例如处理渲染事件时,事件会在父视图中被处理,
然后在传递给子视图,因为他们都是相同的类型,事件可以传递到树形结构的每一视图。
客户端可以统一的使用组合对象或单个对象,而不暴露组合结构其内部表示。
可以很容易在组合体内加入具有相同抽象类型的对象. 客户端不必因为加入了新的对象而更改代码。
Composite模式和Decorator模式虽然逻辑完全不同,但是从类图中可以看到它们有着相似的结构,
Composite模式重在构造类,而Decorator模式重在不生成子类即可给对象添加职责。
所以两种模式侧重点不一样,Decortor模式重在修饰,而Composite模式重在表示。
8.依赖关系
对象模型中依赖关系描述两个模型元素之间的语义连接关系:
其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,
如果独立的模型元素改变了,将影响依赖于它的模型元素。
面向对象设计中:
耦合度:当修改一个对象的时候,对另外一个对象的影响程度
低耦合: 当修改一个对象的对其他对象影响比较小
高内聚:一个对象仅仅做自己相关的事情
面向对象设计原则:单一职责原则
9.关联关系
当一个对象拥有另外一个对象的时候,当B对象为A对象的成员变量的时候,B对象与A对象之间存在一种关联关系。
关联关系是面向对象中最常用一种关系。
关联关系的耦合度要高于依赖关系。
10.方法重载的问题
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
调用重载方法时,其他语言(Java、c++)编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。
OC中没有方法重载。
OC没有严格的方法重载.
在OC中,方法名不允许相同。
11.关于static关键字
static 修饰局部变量:延长布局变量的生命周期。
static 修饰全局变量:当前变量只能在当前文件中使用。
static 修饰函数:函数只能在当前文件中使用。
在OC中,static关键字:
在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值。
变量为静态变量,位于程序的全局数据区。
若作全局变量,可将声明放在实现文件的开始部分。
使用static修饰实例变量是不被允许的,使用static修饰了方法,也是错误的。
可以定义全局变量。
可以定义局部变量和C语言一样,延长变量生命周期。
注意
static型全局变量的可见性,局限于当前.m文件。
其他的文件中的类,无法访问到该变量。