一. 成员变量的封装
优点:外界无法随意修改类中成员变量的值,把内部变量隐藏起来,提高了程序的安全性。
1、 set方法
作用:1> 提供一个方法给外界用来设置成员变量值;
2> 可以在方法里面过滤掉一些不合理的值。
命名规范:1> 方法名必须以set开头;
2> et后面跟上成员变量的名称,成员变量的首字母必须大写;
3> 返回值一定是void;
4> 一定要接收一个参数,而且参数类型跟成员变量类型一致;
eg:
-(void)setAge:(int)age
{
_age=age;
}
方法调用时和普通方法调用一样:[执行者 方法]
eg:[p setAge:10];
2、get方法
作用:返回对象内部的成员变量。
命名规范:1> 肯定有返回值,返回值类型肯定和成员变量的类型一致。
2> 方法名跟成员变量名一致。
3> 不需要接收任何参数。
eg:
-(int)age
{
return _age;
}
方法调用和普通方法调用一样:[执行者 方法];
eg: int age = [ p age];
3、弱语法
1> 在C语言中,随便调用一个函数,只要语法对,编译器只会警告,不会报错,只是在链接的时候报错;
2> 在OC语言中,随便调用一个方法,编译器只会警告,不会报错,也可以链接成功,只是在运行时发生错误,经典错误信息如下:
提示错误:指针并未找到相应的方法(给对象Person发送了一个不能识别的方法test())
3> 一旦程序在运行中出错,就会闪退。
4、类方法(类调用、”+“开头、不能访问成员变量)
1、方法分为两种:对象方法和类方法
对象方法:1> 减号“-”开头;
2> 只能由对象来调用;
3> 对象方法中能访问当前对象的额成员变量。
类方法: 1> 以加号”+“开头;
2> 只能由类来调用;
3> 类方法中不能访问成员变量。
2、类方法的好处
1> 不依赖于对象,执行效率高;
2> 能用类方法,尽量用类方法;
3、 使用场合:当方法内部不需要使用到成员变量的时候,就可以改为类方法。
4、 在一个类中不可以同时存在两个同名的类/对象方法,但是可以同时存在同名类方法和对象方法。
eg:-(viod)test;
+(viod)test; // 可以
5、self关键字
1. self是一个指针,指向调用当前方法的对象,即方法调用者。谁调用了方法,self就指向谁。看self所处的当前环境:
self出现在对象方法中,self就代表对象;
self出现在类方法中,self就代表类。
2. self的用途:
1>可以利用”self ->成员变量名“访问当前对象内部的成员变量;
2>[self 方法名]可以调用其他对方法或类方法。
3. self容易引发死循环。
二、继承(英文:)
1、若类A继承类B,则B拥有A的所有东西(成员变量及方法)。此时称:类A是类B的父类,类B是类A的子类。
特点:子类一旦继承了父类,则子类拥有父类中所有的成员变量和方法。
优点:1>抽取重复代码;
2>建立类之间的关系;
3>子类拥有父类中所有属性和方法。
缺点:耦合性强(父类的改变会影响到子类,如果一个类丢失,另外一个类也将不能使用)。
2、注意点:1> 基本上所有类的根类是NSObject;
2> 子类和父类不能定义相同的成员变量;
3> 允许子类和父类有相同的方法,调用某个对象的方法时,会优先调用子类的方法,然后再去父类中找。(一层一层往上找)
4> 父类必须申明在子类前面(只要申明在前就可以了,方法可以写在后面)
5> 每个类中都有一个superclass指针,指向自己的父类。
eg:@interface Student:Person
3、组合与继承
继承:xxx是xx,比如student是person(同一种类型范畴);
组合:xxx拥有xx,比如student拥有Score@interface Student :NSObject
{
Score *_Score;//Score是另外一个类,Student类与Score类组合,Student拥有Score类的成员
}@end
4、Super关键字
作用:1> 可以直接调用父类中的方法;
2> 如果super处在对象方法中,就会调用父类的对象方法;
如果super处在类方法中,就会调用父类中的类方法。
使用场合:子类重写父类的方法时想保留父类的一些行为。(子类可以直接调用父类的某个方法[super 方法名])
eg:在重写父类的基础上,再保留父类的方法:
-(void)walk //重写父类的walk方法
{
NSLog("往前走几步");
[super walk]; //调用父类的walk方法
}
三、多态(多种形态,父类指针指向子类对象)
1、概念:某一类事物的多种形态。比如狗可以有多个形态,一是以狗的形式存在,二是以动物的形式存在。
2、条件:一定要有继承,没有继承就没有多态。
eg:Animal *a = [dog new]; // Animal是父类,dog是子类,狗是动物。
Dog *d = [Animal new]; //错误,因为动物不一定是狗也可能是猫。
3、优点:节省代码,提高效率。
eg://如果方法或函数参数中使用的是父类类型,则可以通过父类指针传入父类和子类对象。
viod feed(Animimal *a) //定义喂动物的函数
{
[a eat];
}
// 解析:上述函数的形参是父类Animal,所以函数可以传入父类和子类。这样的话狗和猫都能使用feed函数,节省代码。
4、局限性:父类类型的指针不能调用子类的方法(必须将父类指针强制转换为子类指针时才能调用子类中的方法)。
eg:
//Dog有一个run方法
int main()
{
Animal *a = [Dog new];
[a run];//编译时会警告,但是可运行,不建议这样写。
Dog *d = (Dog*)a;// 将父类指针a强制转换成子类指针d
[d run];
}
总之:1> 没有继承就没有多态;
2> 代码体现:父类类型的指针指向子类对象;eg:Animal *a = [Dog new];
3> 好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象;
4> 局限性:父类类型的变量,不能直接调用子类特有的方法。必须强制转换为子类类型变量后,才能直接调用子类特有的方法。
四、OC字符串
1、创建OC字符串的方法
1> NNString *str = @"itcoast";// oc字符串以@开头
2> NNString *str = [NSString stringWithFomat:@"my age is %d,number is %d",age,no];
2、长度算法:[str length]// 直接调用NSObject中的length方法,length方法计算的是字数(包括空格),并不是字符数。
eg: “哈哈Jack”字数为6个字(汉字和字母一样都算一个字)
占位符:%@