1.类的定义
类=属性+方法
--属性代表类的特征
--方法是类能对变化做出的反应
类定义的格式:类的声明和类的实现组成
--接口(类的声明):@interface 类名:基类的名字
.类名的首字母要大写
.冒号表示继承关系,冒号后面的类是父类
.NSObject是所有类的基类
.类的声明放在“类名+.h文件中,要由两部分组成:实例对象和方法声明”
--实现(类的实现):@implementation类名
.方法实现
都用@结束
2.类的使用
.oc中对象通过指针来声明。如ClassA*object;
oc中对象的创建,使用alloc来创建一个对象。编译器会给对象分配一块可用的内存地址。然后需要对对象进行初始化即调用init方法,这样这个对象才可以使用。
如:
Person *person=[Person alloc];
person=[person init];
或者可写成:
Person *person=[[Person alloc] init];
.同一类的每个对象有不同的实例变量的存储空间,同一类的每个对象共享该类的方法。
.方法嵌套的形式来调用,如:ClassA *object=[[ClassA alloc] init];
3.类的访问权限
.三种访问权限
--公有的@public
--私有的@private
--保护的@protect
属性默认的权限是保护的;
方法默认的权限是公有的;
4.方法的定义
.无参无返 -(void)print;
.无参有返 -(Person *)register;
有参无返 -(void)init : (int)newId;
有参有返 -(Person *)init:(int)newId;
5.多参数方法的定义
带一个参数的方法
--(Person *)init:(int) newId;
待两个参数的方法
-(Person *)init : (int) newId andAge :(int) newAge;
: 是方法名的一部分
-第一个方法名:init :
-第二个方法名:init :andAge :
-(Person *)initWithId:(int) newID andAge:(int) newAge andName:(NSString *)name;
可以在方法名前面加任意标记如“WithId”,“andAge”,“andName”以此类推
6.类方法和对象方法对比
.对象方法(实例方法)
--以减号-开头
--只能让对象调用,没有对象,方法不能被执行
--对象方法能访问实例变量(成员变量)
类方法
--以加号+开头
--只能用类名调用,对象不能调用
--类方法不能访问实例变量
--使用场合:当不需要访问成员变量的时候,尽量用类方法
--类方法和对象方法可以重名
实例:
main.m:
#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
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.继承
·不改变原来模型的基础上,拓充方法
·建立了类与类之间的联系
·抽取了公共代码
·减少冗余代码
·坏处:耦合性强
原文:http://www.cnblogs.com/jiangyicheng/p/5103897.html