------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 封装(成员变量封装)
优点:外界无法随意修改类中成员值或屏蔽类中成员变量,提高了程序安全性。
在安全性前提下,外界访问类对象中成员值可通过以下方法:
1.1 set方法(可读可写)
作用:1>外界可以修改成员变量值。
2>对外界传入的参数值进行过滤。
命名规范:(1)方法名必须以set开头。
(2)set后面跟上成员变量的名称,且变量名首字母大写。
(3)返回值一定是void(无返回值)。
(4)set方法的形参名称不能跟成员变量名一样。
(5)一定有形参,且参数类型跟成员变量类型一样。
eg: - (void)setAge:(int)age
{
_age=age;
}
调用方法:和调用普通方法一样,[执行者 行为]
eg: [p setAge:10];
1.2 get方法(可读)
作用:返回对象内部的成员变量。(只读)
命名规范:(1)肯定有返回值,而且返回值类型与成员变量类型相同。
(2)方法名跟成员变量名相同
eg: - (int)age
{
return _age;
}
调用方法:和调用普通方法一样,[执行者 行为]
eg: int age=[p age];
1.3弱语法问题
经典错误:
eg:
#import <Foundation/Foundation.h>
@interface Person :NSObject // 定义Person类
@end
@implementation Person // 实现Person方法
@end
int main()
{
Person *p = [Person new];
[p test];
}
以上错误原因:指针并未找到相应的方法。(给对象Person发送了一个不能事变的方法test()
)
注意点:1> OC是在运行过程中才会检测对象有没有
实现相应的方法。
2>程序闪退原因:程序在运行中出错。
2.类方法
1>定义:直接使用类名进行调用。
eg: [Person new];//Person类直接调用new方法
2>语法:类方法都是以+开头
eg:+ (void)run;// 声明一个run的类方法
3>类方法和对象方法区别
注意点:对象方法可以和类方法重名。
4>对象方法和类方法的区别
对象方法:
(1)减号-开头
(2)只能由对象来调用(首先要通过类创建方法)
(3)对象方法能访问当前对象的成员变量
(4)需要传递参数
访问机制:首先通过对象指针访问对象,然后再通过对象内部的ISA指针访问类。(访问过程比较复杂)
类方法:
(1)加号+开头
(2)只能由类来调用
(3)类方法不能访问成员变量
(4)不需要传递参数
优点:不依赖于对象,执行效率高。
使用场合:当方法内部不需要使用成员变量时,就可以使用类方法
访问机制:直接访问类。
工具类:基本没有任何成员变量,而且其中的方法都是类方法。
3.self
概念:
self是一个指针,指向方法的调用者(谁调用self,它就指向谁:如果是对像调用,则指向对象)。
1>self在对象方法中,则self代表对象
2>self在类方法中,则self代表类
作用(只例举两个):
(1)可访问当前对象内部的成员变量(self->成员变量)。
(2)可直接调用当前对象的方法([self 方法])。
eg:
- (void)setAge:(int)age // 设置age的set方法
{
_age=age;
// 或者self->_age=age; 代表将age的值赋值给当前对象的_age成员属性。
}
4.继承
特点:子类一旦继承父类,则子类拥有父类中所有成员变量与方法。
注:每个对象有个ISA指针,指向类,然后每个类中都有个指针superclass,指向父类。
具体访问结构图:
解释:1>对象根据ISA指针寻找Student类中的方法。
2>如果在Student类中没找到,则类根据superclass指针在父类中寻找相关方法,以此类推,直到找到方法为止。
优点:
(1)抽取重复代码,提高编程效率
(2)建立了类之间的关系
(3)子类拥有父类中所有属性和方法。
缺点:偶合性较强。(父类的改变会影响到子类)
注意点:
(1)所有类的根类是NSObject。
(2)子类和父类不能定义相同的成员变量(继承除外)。
(3)父类必须声明在子类之前
(4)调用某个方法时,优先在当前类中寻找,然后再去父类中寻找。(从下到上寻找)
eg:
// 声明Person类
@interface Person : NSObject
{
int _age;
int _id;
}
// 声明属性的setter和getter方法
- (int)age;
- (void)setAge:(int)age;
@end
// 实现Person类
@implementation Person
- (int)age {
return _age;
}
- (void)setAge:(int)age {
if(age < 0) {
age = 1;
}
_age = age;
}
@end
// 声明Student类,并继承Person类,关键点 冒号: 代表继承关系
@interface Student : Person
@end
@implementation Student
@end
int main() {
Person *p = [Student new]; //学生同时也是人
return 0;
}
以上代码显示:Student类继承了Person类,因此Student类拥有Person类的所有属性和方法
5.重写:
概念:子类重新实现父类中的某个方法(对某个方法重新实现),覆盖父类某个方法以前的做法。
使用场合:
(1)当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
(2)当A类有用B类中的部分属性和方法时,可以考虑让B类继承A类。
6.组合
组合:XXX拥有XXX(B类拥有A类的属性,例如学生拥有成绩的属性)
继承:XX是XXX(B类是A类,例如狗是动物)
@interface Student : NSObject
{
Score * _score;//Score是另外一个类,Student和Score类组合,Student拥有Score类的成员。
int _Age;
}
组合的调用方法:
[_score Cscore]; //Cscore是Score类中的成员属性。
7.Super
子类调用父类中的某个方法
super处于对象方法中时,那么就会调用父类的对象方法
super处于类方法中时,那么就会调用父类的类方法
使用场合:子类重写父类的方法时想要保留父类的一些行为
(子类可以直接调用父类中的某个方法 [super 方法名])
eg: 在重写父类的基础上,再保留父类的方法。
- (void)walk // 重写父类的walk方法
{
NSLog("跳两下");
[super walk]; // 调用父类的walk方法
}
8.多态
0>概念:某一类事物的多种形态。(例如变形金刚)
1>条件: 一定要有继承,没有继承就没有多态。
Animal *a=[dog new];//Animal是父类,dog是子类 , 狗是动物
错误写法:Dog *d=[Animal new]; // 动物不一定是狗,也可能是猫
2>优点:节省了代码,提高了效率。
eg:如果方法或函数参数中使用的是父类类型,则可以使用父类指针传入父类和子类对象。
void feed(Animal *a) // 定义喂动物的函数。
{
[a eat];
}
解析:上述函数的形参是父类Animal,所以此函数可以传入父类和子类。
3>局限性:
父类类型的指针不能调用子类的方法。
(必须将父类指针强制转化为子类指针时才能调用子类中方法)
eg:
Animal
*
a=[dog new];
Dog *d = (dog *) a; // 将父指针a强制转化为子类指针d
8.OC字符串
8.1 创建字符串方法
1>NSString *str=@"OC String";//oc字符串以@开头
2>NSString *str=[NSString stringWithFormat:@"my age is %d,number is %d",age,no];
8.2 长度算法
长度算法:[str length]//直接调用NSObject中的length方法,且此方法算的是字数(包含空格),并不是字符数
占位符:%@