一、类方法
1. 概述:
1)实例方法就是一个方法,它在类的是实例范围内执行。即:在调用实例方法前,必须创建一个类的实例。
2)类方法不需要创建实例。
3)+表示类方法,就是类调用方法,不依赖任何对象的方法。-表示是实例方法。
2. 类方法调用
[类名称 类方法名称];
3. 注意事项
1)实例方法和类方法同名
2)类方法可以从父方法继承而来,子类可以重写类方法。
3)类方法和实例方法一样在interface里声明,在implementation 里实现
4)类方法只能被向类方法发送消息才被执行,向实例对象发送类方法是不能被执行的
5)在类方法是使用了self,这个self执行的类对象class object 而不是实例对象instance object
4. 类方法的优点
1)节省内存空间 2)提供效率 3)作为工具方法
5. 类方法易犯错误:
类方法中不能访问类的成员变量
6. 类方法和对象方法比较:
1)对象方法(实例方法):
以 - 号开头
可以使用成员变量
用对象调用对象方法(可以直接调用类方法)
对象方法可以调用当前对象或者其它对象的方法(是通过将对象作为参数传入方法)
对象方法中可以调用其它对象方法:
(1)当前对象方法中,可以创建对象(可以是当前类实例对象,也可以是其它类实例对象),使用新创建的对象调用对象方法。
(2)可以使用self
(3)对象作为方法参数传递过来,可以使用传递过来的对象调用方法
2)类方法:
以+号开头
在类方法中可以调用对象方法(不能直接调用对象方法)
(1)对象作为方法参数传递过来
(2)可以创建一个对象
类方法可以调用其它类方法,但是类方法不能调用自身(调用自身会形成死循环)
3)示例程序:简单计算器
类的声明
+(void)add:(int)num1 and:(int)num2; //两数相加
+(void)sub:(int)num1 and:(int)num2; //两数相减
+(void)mul:(int)num1 and:(int)num2; //两数相乘
+(void)div:(int)num1 nad:(int)num2; //两数相除
类的实现
#import "Calculator.h"
@implementation Calculator
+(void)add:(int)num1 and:(int)num2 //两数相加
{
NSLog(@"%d + %d = %d",num1,num2,num1+num2);
}
+(void)sub:(int)num1 and:(int)num2//两数相减
{
NSLog(@"%d - %d = %d",num1,num2,num1-num2);
}
+(void)mul:(int)num1 and:(int)num2 //两数相乘
{
NSLog(@"%d * %d = %d",num1,num2,num1*num2);
}
+(void)div:(int)num1 and:(int)num2//两数相除
{
NSLog(@"%d / %d = %.2f",num1,num2,(float)num1/num2);
}
@end
主函数
#import <Foundation/Foundation.h>
#import "Calculator.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
[Calculator add:10 and:20];
[Calculator sub:10 and:2];
[Calculator mul:10 and:3];
[Calculator div:25 and:5];
}
return 0;
}
运行结果
二、匿名类
1. 用[Car new] ( [[ Car alloc ] init ] )分配给Car类一个实例空间
2. 使用方法:
1)使用匿名类访问实例变量,可以访问该匿名实例,但是只能访问一次。以后访问,会新建一个实例空间。
2)使用匿名类可以调用方法。
3. 匿名类的优缺点
优点:可以简化代码,方便方法调用。
缺点:匿名对象实例化以后,只能正确的使用成员变量一次。
三、封装
1. 将数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不可被外部任意修改,是面向对象设计的本质。降低了数据无用的可能性。
2. 封装的步骤
1)setter方法(设置器):在set方法的内部可以对一些不合理的数据过滤筛选。set方法作用:为提供一个设置成员变量值的方法。
命名规范:
(1)方法名必须以set开头
(2)set后面跟上成员变量的名称,首字母大写
(3)返回值一定是void
(4)一定要接受一个参数,而且参数类型需要和成员变量的类型一致
(5)形参名不能和变量名一样(成员变量名以_线开头)
好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤
2)getter方法(访问器)
作用:为调用者返回对象内部的成员变量
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和去掉下划线的成员变量名一样
(3)不需要接收任何参数
3)示例程序
类声明
typedef enum{kSexFemale,kSexMale} Sex;
@interface Person : NSObject
{
NSString *_name; //姓名
Sex _sex; //性别
int _age; //年龄
float _height; //身高
}
//设置成员变量的值
-(void) setName:(NSString *)name;
-(void) setSex:(Sex)sex;
-(void) setAge:(int)age;
-(void) setHeight:(float)height;
//访问成员变量的值
-(NSString *)name;
-(Sex)sex;
-(int)age;
-(float)height;
@end
set
-(void) setName:(NSString *)name{
_name = name;
}
-(void) setSex:(Sex)sex{
_sex = sex;
}
-(void) setAge:(int)age{
_age = age;
}
-(void) setHeight:(float)height{
_height = height;
}
get
-(NSString *)name{
return _name;
}
-(Sex)sex{
return _sex;
}
-(int)age{
return _age;
}
-(float)height{
return _height;
}
@end
四、依赖关系
1. 概念:A对象作为B对象的局部变量或是方法形参的,B依赖与A,这时候我们称A与B存在一种依赖关系。
2. 耦合度:当修改一个对象的时候,对另外一个对象的影响程度。
3. 低耦合:当修改一个对象,对其它对象影响比较小。
4. 高内聚:一个对象仅仅做自己相关的事情。
5. 面向对象设计原则:单一职责原则。
五、关联关系
1. HasA关系:当一个对象拥有另外一个对象的时候,当B对象为A对象成员变量的时候,B对象与A对象之间存在一种关联关系。
2. 关联关系的耦合度高于依赖关系。
3. 关联关系是面向对象中最常用的一种关系。
六、static关键字
1. 在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值。
2. 变量为静态变量,位于程序的全局数据区。
3. 变量为全局变量,可将声明放在实现文件(.m)的开始部分。
4. 使用static修饰实例变量是不被允许的。