您的位置:首页 > 其它

一.类和对象

2016-01-30 21:32 309 查看
1.接口部分:对外声明类的行为和特征(类的定义分为:接口部分和实现部分)

① @interface 接口关键字:用于表示这是一个类的接口部分
接口部分功能:是定义类的静态特征和声明动态行为
@end 作为结束标志

对外接口:通过接口就可以在不知道实现的情况下,了解这个类有什么

Person:类名,每一个类都要起一个名字。首字母大写(类:对象的类型)
NSObject:父类
@interface Person: NSObject
②静态特征:实例变量
③实例变量必须在花括号中
④创建实例变量的时候不能被赋值
⑤在创建实例变量的时候,实例变量钱加“_”:系统这样写;区分;
{
⑤实例变量的可见度
《1》内部:类的实现部分使用实例变量
《2》外部:不在实现部分使用
《3》@public范围:外部、内部、继承
《4》@protected(系统默认)范围:内部、继承
《5》@private范围:内部
//添加当前类属性
@public//作用范围是直到下一个结束或者实例变量结束
NSString *_name;
NSInteger _age;

@protected
CGFloat _height;

@private
CGFloat _weight;
}

//动态行为:方法(添加类的行为)
- (void)sayHi;

@end
2.实现部分:类行为的具体实现(方法的实现)
①@implementation:关键字,表示类的实现部分
Person:类名,表示实现的是哪个类
@end:类 结束实现标志
@implementation Person

- (void)sayHi{
NSLog(@“Hello World”);
}

@end
3.使用类创建对象。Objective-C中创建的对象,全部放在堆区(对象:类的实例)
int main(){
@autoreleasepool{
①申请空间
保存空间地址
《1》内存分配 (alloc方法:用于分配内存空间)
Person *p = [Person alloc];
《2》对象初始化(init方法:用于初始化对象),将内存空间数据清零
p = [p init];

《3》将创建对象的《1》和《2》合成一步
Person *p1 = [[Person alloc] init];

②使用成员变量
p1->_age = 10;
p1->_name = @“贝爷”;

③使用方法
[p1 sayHi];
}
return 0;
}
4.类是对一类具有相同事物行为和特征事物的抽象
5.封装、继承、多态
①封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内
②继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系
③多态:指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
6.@class的作用:只是表示有Girl这么一个类型,其他的什么都没做。在什么地方使用Girl这个类时,再导入Girl.h
注意:我们一般选择在.h中使用@class,在.m中引入头文件
7.组合类的使用:(指针存储对象的首地址,代指对象。OC中使用指针代指对象,进行操作)
①Mother.h
#import <Foundation/Foundation.h>

@interface Mother : NSObject
{
@public
NSString *_name;
}
@end
②Father.h
#import <Foundation/Foundation.h>

@interface Father : NSObject
{
@public
NSString *_name;
}

@end
③Child.h
#import <Foundation/Foundation.h>

@interface Child : NSObject
{
@public
NSString *_name;
}
@end
④Family.h
#import <Foundation/Foundation.h>
#class Father;
#class Mother;
#class Child;

@interface Family : NSObject
{
@public
Father *_f;
Mother *_m;
Child *_c;
}

@end
⑤main.m
Father *father = [[Father alloc]init];
father->_name = @"父亲";
Mother *mother = [[Mother alloc] init];
mother->_name = @"母亲";
Child *child = [[Child alloc] init];
child->_name = @"孩子";
Family *family = [[Family alloc] init];
family->_f = father;
family->_m = mother;
family->_c = child;
NSLog(@"%@ %@ %@ ",family->_f->_name,family->_m->_name,family->_c->_name);



8.打印字符串用“%@”做占位符。用”[]”调用方法
有打印,没有控制台输入
9.
①面向过程:编程以事件(任务)为中心,程序围绕事件,列出了事件的每个步骤,一步一步完成(侧重点:实现功能 C)
②面向对象:编程以事物为中心,程序围绕事物展开,完成事件只是一个小任务(侧重点:对象的特征 OC,C++,java)
10.Objective-C中的几种方法
①“-”实例方法:由类的实例来执行。换言之,在调用实例方法之前,必须先创建该类的实例。实例方法是最常见的方法类型(方法只能对象使用)
示例:- (instancetype)init;
// 有参(1个参)无返回值
// 冒号属于方法名的一部分
// 方法名:printNum:
- (void)printNum:(NSInteger)num;
// 有两个参数
// 方法名:printName:age:
- (void)printName:(NSString *)name age:(NSInteger)age;

//有三个参数
//方法名:printName:age:score:
- (void)printName:(NSString *)name age:(NSInteger)age score:(CGFloat)score;
②“+”类方法:可由它所在的类直接执行。它不需要对象的实例作为消息的接收者(方法只能被类使用)
示例:+ (instancetype)alloc;
注:类方法中不能使用实例变量
11.instancetype和id区别
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型对象。
②instancetype只能作为返回值和参数,id还可以用来定义变量
③instancetype会告诉编译器当前的类型,但id对编译器却是无类型的,调用任何方法不会给出错误提示
④对于init方法,id和instancetype是没有区别的。因为编译器会把id优化成instancetype。当明确返回的类型就是当前class时,使用instancetype能避免id带来的编译不出错误的情况。
12.如何获取方法名
①删除:类型标识,返回类型,参数类型,参数名,空格。
示例:replaceObjectAtIndex:withObject
注意:类中不能出现同名方法;“:”标识参数,不能省略。有冒号必须有参数;冒号属于方法名的一部分。
13.在OC中使用消息发送机制:[receiver message]
表述:①给receiver对象发送message消息②receiver接收到消息,即方法getSalary③receiver找到message方法,并执行
14.setter和getter方法
①在OC中,为单一实例变量赋值的方法称作setter(设置器)
②获取单一实例变量值得方法称作getter(访问器)
15.setter和getter方法的书写格式
给实例变量:NSInteger _age;
①setter的书写格式:- (void)setAge:(NSInteger)age;
即set+首字母大写的实例变量名(忽略下划线)
②getter的书写格式:- (NSInteger)age;
j即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)
16.setter和getter与实例变量的关系
①无论setter还是getter内部操作的是实例变量
②每一个实例变量都需要一对setter和getter方法
17.setter和getter的实际操作
①Person.h
#import <Foundation/Foundation.h>

//类的接口部分
/*
1.定义一个类
2.添加当前类属性(特征)
3.添加当前类行为(方法)
*/
@interface Person : NSObject
{
//大括号内部,添加当前类属性
//字符串类型
NSString *name;//姓名,NSString同样是一个类
//整型
NSInteger age;//年龄,NSInteger是数值类型,不是一种类
//字符串类型
NSString *gender;//性别
}
//初始化方法
//希望通过初始化方法,能够获得一个Person类的实例对象,并且希望该对象具有自己的姓名属性
- (id)initWithName:(NSString *)_name;

//大括号外部,添加当前类行为
- (void)sayHi;

//设置器 setter
- (void)setName:(NSString *)_name;
- (void)setAge:(NSInteger)_age;
- (void)setGender:(NSString *)_gender;

//访问器 getter
- (NSString *)getName;
- (NSInteger)getAge;
- (NSString *)getGender;

@end
②Person.m
#import "Person.h"

@implementation Person

- (id)initWithName:(NSString *)_name{

//1.原始初始化,也就是将内存内的变量置零
self = [super init];//将init方法发送给super对象
//2.原始初始化成功之后,需要设置当前对象的姓名为形参
if (self != nil) {
name = _name;
}
//3.返回当前对象
return self;
}

//大括号外部,添加当前类行为
- (void)sayHi{

//NSLog将字符串打印在控制台进行输出,类似于printf();
NSLog(@"hello world");
}

//设置器 setter
- (void)setName:(NSString *)_name{
//设置给当前对象的属性
name = _name;
}
- (void)setAge:(NSInteger)_age{
age = _age;
}
- (void)setGender:(NSString *)_gender{
gender = _gender;
}

//访问器 getter
- (NSString *)getName{
//访问当前对象的属性
return name;
}
- (NSInteger)getAge{
return age;
}
- (NSString *)getGender{
return gender;
}
@end
③main.m
#import <Foundation/Foundation.h>
#import "Person.h"//引入类名字
int main(int argc, const char * argv[]) {
//1.创建Person类的实例对象
Person *person = [[Person alloc] initWithName:@"Lewis"];//用【】调用方法
//2.给person发送实例消息sayHi
[person sayHi];

//修改name,添加设置器(setter)与访问器(getter)
/*
类名 属性名 设置器方法名 访问器方法名
Person name -setName: -getName
*/

//3.先打印当前person实例对象的姓名是什么
NSLog(@"person's name is %@",[person getName]);

//4.修改当前person实例对象的姓名,修改成jack
[person setName:@"Jack"];
NSLog(@"person's name is %@",[person getName]);

}
18.点语法(只对getter setter有效)
s.name = @"小白";
NSLog(@"%@",s.name);

[s setAge:12];
NSLog(@"%ld",[s age]);
s.score = 99.99;
NSLog(@"%.2f",s.score);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: