类
1.类的定义:
类=属性+方法;
-属性代表类的特征
-方法是类能对变化做出的反应
类定义的格式:类的声明和类的实现组成
-接口(类的声明):@interface 类名:基类的名字
.类名首字母要大写
.冒号表示继承关系,冒号后面的是类的父类
.NSObject是OC所有类的基类
.类的声明放在“类名+.h”文件中,要由两部分组成:实例变量和方法
-实现(类的实现):@implementation类名
.方法实现
-都用@end结束c
2.类的使用:
OC中,对象通过指针来声明 如:ClassA *object;
OC中对象的创建,使用alloc来创建一个对象,编译器会给object对象分配一块可用的内存地址,然后需要对对象进行初始化即调用init方法,这样这个对象才可以使用,如:
Person *person=[Person alloc]; //创建对象分配空间
person=[person init]; //初始化赋初值,
初始化后:int=0,char=“*0”?,bool=FALSE
同一个类的每个对象有不同的实例变量的存储空间
同一类的每个对象共享该类的方法
方法嵌套的形式来调用,如:ClassA *object=[[ClassA alloc] init];
3.类的访问权限
三种访问权限:
-公有的:@public
-私有的:@private
-保护的:@protected
属性默认的权限是保护的
方法默认的权限是公有的
4.方法定义
无参无返: -(void)print;
无参有返: -(Person *)register;
有参无返: -(void)intuit:(int)newId;
有参有返: -(Person *)init:(int)newId;
带一个参数的方法
-(Person *) init:(int) newID;
带两个参数的方法:
-(Person *) init:(int) newID:(int) newAge;
“:”是方法名的一部分
-第一个方法名:init
-第二个方法名:init:
-第三个方法名:init::
多参数方法定义:
-(Person *)initWithId:(int) newID andAge:(int) newAge andName:(NSString *)name;
可以在方法名前面加任意标记如“WithId”,“andAge”,“andName”以此类推
5.实例
main:
#import <Foundation/Foundation.h> #import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象,即实例化对象 Dog *haShiQi=[[Dog alloc]init]; //方法调用 [haShiQi bark]; //属性赋值 haShiQi->health=120; haShiQi->name=@"哈士奇"; NSLog(@"狗的姓名:%@,健康值%d",haShiQi->name,haShiQi->health); } return 0; }
Dog.m:类的实现
#import "Dog.h" //引用类的声明文件 @implementation Dog //方法实现 -(void)bark{ NSLog(@"汪汪"); } @end
Dog.h:类的声明
#import <Foundation/Foundation.h> @interface Dog : NSObject //声明类Dog,继承根基类NSObject //类的属性 { @public; //设置类的属性为公有(一般不允许使用) NSString *name; int health; } //对象方法 -(void)bark; @end
6.类方法和对象方法对比
·对象方法(实例方法)
-以减号“-”开头
-只能让对象调用,没有对象,这个方法根本不可能被执行
-对象方法能访问实例变量
·类方法
-以加号“+”开头
-只能用类名调用,对象不能调用
-类方法中不能访问实例变量(成员变量)
-使用场合:当不需要访问成员变量的时候,尽量用类方法
-类方法和对象方法可以同名7.属性的存取方法
·获取属性值(getter)方法的定义
-作用:返回对象内部的成员变量
-命名规范:get方法的名称一般就跟成员变量同名
·设置属性的值(setter)方法的定义
-作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
-命名规范:
-方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写
-形参名称不要跟成员变量同名
8.getter,setter方法实例
main:
#import <Foundation/Foundation.h> #import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象,即实例化对象 Dog *haShiQi=[[Dog alloc]init]; //方法调用 [haShiQi bark]; //属性赋值 [haShiQi setName:@"哈士奇"]; //调用setter方法赋值 [haShiQi setHealth:120]; NSLog(@"狗的姓名:%@ 健康状况:%d",haShiQi.name,haShiQi.health); } return 0; }
Dog.m:类的实现
#import "Dog.h" //引用类的声明文件 @implementation Dog //方法实现 -(void)bark{ NSLog(@"汪汪"); } //setter方法 -(void)setName:(NSString *)newName{ name=newName; } //getter方法 -(NSString *)name{ return name; } //setter方法 -(void)setHealth:(int)newHealth{ health=newHealth; } //getter方法 -(int)health{ return health; } @end
Dog.h:类的声明
#import <Foundation/Foundation.h> @interface Dog : NSObject //声明类Dog,继承根基类NSObject //类的属性 { NSString *name; int health; } //对象方法 -(void)bark; -(void)setName:(NSString *)newName; //setter方法 -(NSString *)name; //getter方法 -(void)setHealth:(int)newHealth; -(int)health; @end
9.自动生成属性的存取方法
·@property语法
·@synthesize
·封装的好处:
-过滤不合理的值
-屏蔽内部的赋值过程
-让外界不必关注内部的细节
10.自动生成属性的存取方法实例
main:
#import <Foundation/Foundation.h> #import "dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //创建对象,即实例化对象 Dog *haShiQi=[[Dog alloc]init]; //方法调用 [haShiQi bark]; //属性赋值 [haShiQi setName:@"哈士奇"]; [haShiQi setHealth:120]; NSLog(@"狗的姓名:%@ 健康状况:%d",haShiQi.name,haShiQi.health); } return 0; }
Dog.m:类的实现
#import "Dog.h" //引用类的声明文件 @implementation Dog //方法实现 -(void)bark{ NSLog(@"汪汪"); } @synthesize name,health; //封装,代替了setter,getter @end
Dog.h:类的声明
#import <Foundation/Foundation.h> @interface Dog : NSObject //声明类Dog,继承根基类NSObject //类的属性 { @public; //设置类的属性为公有 NSString *name; int health; } -(void)bark; @property int health; //封装,代替了setter,getter @property NSString *name; @end
11.方法重载
·OC中不是严格的函数重载
命名冲突:
-(int)doSomething(int)X;
-(int)doSomething(float)X;
命名冲突:
-(int)doSomething(int)x:(int)y;
-(int)doSomething(float)x:(int)y;
不冲突:
-(int)doSomething(int)x:(int)y;
-(int)doSomething(int)x: andY:(float)y;
因为一个是“doSomething:”,“另一个是doSomething::”
12.继承
·不改变原来模型的基础上,拓充方法
·建立了类与类之间的联系
·抽取了公共代码
·减少冗余代码
·坏处:耦合性强
(第一次用,渣排版,请谅解~)