//
// main.m
// oc
//
// Created by 付军伟 on 15/11/16.
// Copyright © 2015年 scsys. All rights reserved.
//
#import <Foundation/Foundation.h>
//创建1.创建一个对象 要现在 要创建的位置导入,要创建那个类(.h)
#import "Person.h"
#import "Phone.h"
#import "Hero.h"// import 导入整个*声明文件* 可以使用里面所有东西 @class 提示类名 并没有使用这个类 只可以使用类名 里面的内容不允许使用
#import "Monster.h"
#import "Flower.h"
#import "YellowPerson.h"
#import "BlackPerson.h"
#import "WhitePerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建2.1开始创建alloc(开辟一个领地,就是一块内存空间)
// 创建2.2inti 创建一个对象(初始化一个对象 有一些基本的功能)
//Person *hanBing=[[Person alloc]init];//Person(类名) *hanBing(对象名)=[Person alloc]给个领地;hanBing=[hanBing init]创建hanBing alloc、init是让一个对象出来(创建)的方法(c的函数 就是oc的方法)
//方法的调用[对象名 方法名];
// [hanBing speak];
// [hanBing smoking];
// [hanBing speak:@"lai"speak: @"en"];
//
// Person *liJiang=[[Person alloc]init];
// [liJiang run];
//2
// Phone *iPhone=[[Phone alloc]init];
// NSString *phoneName = [iPhone name ];
// NSLog(@"%@",phoneName);
}
#pragma mark=====================第一节====================================
/*今天我们学习foundation框架,foundation是cocoa框架中的基础框架 所有得框架都是基于foundation框架 就是把自己当成造物主(程序实现)
抽象事物(一类事物 (oc)类)具有相同特征的事物的类
oc是一门面向对象(万事万物,都是对象,对象之间有某种联系,这个联系也许很远也许很近,就像我们现在这个世界的发展,由远古到近代,由我们看不见的(无)到看见(有)(十分确定的,大家都知道的,越精确地越清楚地事物(特指),这种事物就是对象))的语言
c语言是面向过程(按照电脑思维执行代码,一步一步的走,才能实现某些功能)的语言
oc中的类:(首个字母大写)
有两种部分组成:
1类名.h文件 声明文件(告诉别人的文件) 声明这个类可以让别的类知道的属性和方法
2类名.m文件 实现文件 一个类具体怎么去实现他自己的功能,
oc中去创建一个对象 (创造步奏1 ——2.1——2.2) 对象:一个具体的事物,是一个包含具体属性的一个实实在在的实体
确定对象是哪个类
人类的寒冰*/
#pragma mark=====================第二节====================================
/*字符串 有返回值方法
----------------
有返回值方法的公式:
声明公式:
- (返回值类型)方法名;
实现方法是:
- (返回值类型)方法名
{
return 返回值类型的数据
}
调用:
[对象名 方法名];//他就是具体的数据
有返回值的方法的作用:给别人一个数据
有参无返回值的函数 给别人要个数据
- (void)函数名:(参数类型)参数名
{}
---------------
字符串
NSString
1.初始化
NSString *string = @"我是万元班的学生。";
NSString *string = [NSString string];//创建空字符串
NSString *string = [[NSString alloc]init];//创建空字符串
2.处理字符串
2.1 把字符串转成大写(字母构成)
NSString *name = @"fuluwa";
name = [name uppercaseString];
NSLog(@"%@",name);
2.2 把字符串转成小写(字母构成)
NSString *name = @"FULUWA";
name = [name lowercaseString];
NSLog(@"%@",name);
2.3首个字母大写
NSString *name = @"fuluwa";
name = [name capitalizedString];
NSLog(@"%@",name);
3判断字符串是不是以什么字符开头的
BOOL 布尔类型——>只有yes(1) no(0)
BOOL 默认值 是NO
NSString *Phone =@"18628861029";
BOOL isRight = [Phone hasPrefix:@"135"];
if (isRight !=YES) {
NSLog(@"bushi");
}
else{ NSLog(@"shi");}
判断以什么结尾
BOOL 是以!=yes判断
NSString *Phone =@"18628861029";
BOOL isRight = [Phone hasSuffix:@"1029"];
if (isRight !=YES) {
NSLog(@"bushi");
}
else{ NSLog(@"shi");}
4判断字符串中有没有那些字
NSRange:范围 以起点位置和长度表示
NSRange range;
range.location起点位置 = 1;
range.length长度 = 3;
NSString *string = @"背着书包去放牛。";
// 需要找书包 NSNotFound表示没有找到
NSRange range = [string rangeOfString:@"书包"];
if (range.location !=NSNotFound ) {
NSLog(@"背着书包呢");
}
5判断 字符相同
NSString *string =@"阿里";
BOOL isEqual =[string isEqualToString:@"阿狸"];
if (isEqual !=YES) {
NSLog(@"不是相同");
}
else{
NSLog(@"相同");
}
6截取一部分字符串
//开始到那
NSString *string = @"太阳光!金亮亮!鸡唱三场!";
NSString *newstring = [string substringToIndex:3];
NSLog(@"%@",newstring);
//从哪到结尾
NSString *string = @"太阳光!金亮亮!鸡唱三场!";
NSString *newstring1 = [string substringFromIndex:2];
NSLog(@"%@",newstring1);
//从哪到哪
NSString *string = @"太阳光!金亮亮!鸡唱三场!";
NSRange range = {4,3};//不包括4
NSString *newstring2 = [string substringWithRange:range ];
NSLog(@"%@",newstring2);
用户能够看见的是main函数里地NSLog程序,实现方法中的nslog只是让程序员检测有没有实现这个方法
*/
// Phone *iPhone=[[Phone alloc]init];
// [iPhone setName:@"xiaotian"];
// NSString *name1 = [iPhone name ];
// NSLog(@"%@",name1);
#pragma mark=====================第三节====================================
//字符串拼接 stringByAppendingString 和stringByAppendingFormat:的方法
//stringByAppendingFormat:和stringWithFormat: 都可以把其他都格式化为字符串
// NSString *string = @"100分";//在string基础上新加一个字符串->生成一个新的字符串
// NSString *string1 = [string stringByAppendingString:@"我开心死了"];//在string的后面拼接上@“我开心死了”, 谁调用哪个拼接方法谁就是新的字符串前面
// NSLog(@"%@",string1);
// NSLog(@"%@",string);
// NSString *string = @"金刚葫芦娃";
// NSString *string1 = @"是";
// int b =500;
// NSString *string2 = @"钢铁的做的";
// NSString *string3 = @"斤";
// //格式化 拼接字符串 可以把任何格式的对象(int float)转换成字符串 生成一个新的字符串
// //在一个字符串的基础之上,拼接一个格式化的字符串->生成一个新的字符串
// NSString *string4 = [string stringByAppendingFormat :@"%@%@%d%@",string1,string2,b,string3];
// float m = 2.2;
// NSString *string5 = [NSString stringWithFormat:@"%@%@%@%d%@",string,string1,string2,b,string3];//使用格式化字符串->把其他格式的转换成字符串 不在原有的字符串内容上添加,添加内容需要我们把原有的给加上
//数据转换
//把其他数据类型 转换成字符串 可以使用格式化 字符串的方法
//字符串 转换成bool类型那个
//除了数字 字符串转成bool或者int 、float 都是0 如果是数字 就是对应的数字
// NSString *s = @"12";
// BOOL is = [s intValue];//bool 里面只有yes(1)no(0)需要转换的字符串内容 必须是 0 1
// int num = [s intValue];
// NSLog(@"%d",is);
// NSLog(@"%d",num);
// //判断字符串的长度 length
// s.length;
//可变字符串NSMutableString
//NSMutableString 是NSString 的儿子 NSString的方法也可以给NSMutableString都可以使用
// NSMutableString *string = @"deg";//直接用@“”是不可变的字符串
//方法前面是-表示是一个对象方法 调用 : [对象名 方法名]
//方法前面是+表示是一个类方法 调用 : [类名 方法名]
//oc 允许把两个方法 一起调用 [[NSString alloc]init];
// NSMutableString *string = [NSMutableString string];
// NSMutableString *string1 = [NSMutableString stringWithFormat:@""];
// NSMutableString *string2 = [NSMutableString stringWithString:@"啦啦"];
//为啥要区分可变和不可变 为了让原来的字符串可以添加内容 修改内容 删除内容。
//增
// NSMutableString *string = [NSMutableString stringWithFormat:@"哇咔咔"];
// [string appendFormat:@"stringFormat"];// 格式化内容
//[string insertString:@"string" atIndex:2];//插入一个字符串 指定位置 index:
//删
//NSRange range = {2,3};
//[string deleteCharactersInRange:range];
//改
// NSRange range1 = {1,2};
// [string replaceCharactersInRange:range1 withString:@"思思123了"];
// NSLog(@"%@",string);
#pragma mark====================数组====================================
//数组 按顺序排列的元素的整体
//取值:通过下标
//NSArray 数组 在oc里面 允许数组里面存放不同数据类型的元素 在取值的时候 一定要注意数组类型 尽量存 相同的数据类型
//NSArray *list = @[@"",@"",@""];//数组里面 存储的都是NSobject类型的数据
//基本类型
// NSNumber或者@ 把数字数据类型的变量包装成(衣服的作用)NSobject类型
//为什么要把数字转换成NSobject
//因为 在我们把数字存放到数组的时候 不可以直接存放非NSobject类型的数据
// int a = 100;
// float b =2.21;
//
// NSNumber *num = [[NSNumber alloc]initWithInt:a];
// NSNumber *num1 = [NSNumber numberWithInt:a];
// NSNumber *num3 = [NSNumber numberWithFloat:b];
// //转换的缩写@(要转的数据)
// NSArray *list = @[num ,@(50)];
// NSNumber *num2 = list[1];
//初始化数组 数组可以存放object类型的数据(基本类型不是object类)允许直接给数组赋值
//NSArray *array = @[数组元素,数组元素];
// Hero *tooHao = [[Hero alloc]init];
// Hero *jChuang = [[Hero alloc]init];
// NSArray *array = @[tooHao,jChuang];//不能把对象当成字符串存放数组
// NSArray *array = [[NSArray alloc]init];//创建空
// NSArray *array2 = [NSArray array];//直接赋空
// NSArray *array1 = [NSArray arrayWithObject:@"lala"];//初始化只有一个元素的数组
//NSArray *array3 = [NSArray arrayWithObjects:@"n",@"i", @"s",@"s",@"b",nil];//初始化多个元素的方法 最后一个元素的nil不能省略
//数组取值 根据下标(0开始的)
//获得数组长度的属性 数组名.count
// NSLog(@"%@",array3);
// for (int i=0; i<array3.count; i++) {
// NSString *s= array3[i];
// NSLog(@"%@",s);
// }
//快速遍历方法
// for (元素类型 *对象名==取出来的元素 in 数组名 ) {
// NSLog(@"%@",对象);
// }
// for (NSString *s in array3 ) {
// NSLog(@"%@",s);
//
// }
// Hero *y1 = [[Hero alloc]init];
// Hero *y2 = [[Hero alloc]init];
// NSArray *list = @[y1,y2];
// for (Hero *y in list) {
// NSLog(@"%@",y);
// }
//数组元素之间使用逗号隔开的
// NSArray *list1 = @[@"lucy",@"lily",@"lilei",@"lihanmeimei"];
// //NSLog(@"%@",list1);
//
// NSString *s =[list1 objectAtIndex:0];//通过方法取值 注意数组越界
// for (int i=0; i<4; i++) {
// NSLog(@"%@",[list1 objectAtIndex:i]);
// NSLog(@"%@",list1[i]);
// }
//字符串里面可以直接通过一个符号截取字符串 变成数组(符号被省略)注意区分中英文
// NSString *content = @"福禄娃,小明,老王,大黄 ";
// NSArray *list2 = [content componentsSeparatedByString:@","];
// for (NSString *s1 in list2) {
// NSLog(@"%@",s1);
// }
//数组转换成字符 直接把数组格式化 数组保持原始形态 可以使用componentsJoinedByString 加入一个符号到数组里分开的元素之间生成一个字符串
// NSArray *list3 = @[@"福禄娃",@"小明",@"老王",@"大黄"];
// NSString *content1 = [NSString stringWithFormat:@"%@",list3];
// NSString *content2 = [list3 componentsJoinedByString:@" "];
// NSLog(@"%@",content1);
//可变数组
// NSMutableArray *list = [NSMutableArray arrayWithArray:@[@""]];
//NSMutableArray *list = [NSMutableArray arrayWithObjects:@"", nil];
//增加
//NSMutableArray *list = [NSMutableArray array];
//添加元素
// Hero *hero = [[Hero alloc]init];
// [list addObject:hero];//加一个hero的元素
//[list addObject:hero];//在添加一个hero的元素
//alloc init 会创建一个对象
//有一次alloc init 只会创建一个对象
// for (int i=0; i<10; i++) {
// Hero *hero = [[Hero alloc]init];
// [list addObject:hero];
//
// }//生成了10个元素,是不同的hero元素
// NSLog(@"%@",list);
// NSMutableArray *array = [NSMutableArray arrayWithObjects:@"li", @"lei",nil];
//删除元素 通过下标
// [array removeObjectAtIndex:1];
// NSRange range = {0,2};
// [array removeObjectsInRange:range];
// [array removeLastObject];//删除最后一个
//[array removeAllObjects];//删除全部
//替换元素
// [array replaceObjectAtIndex:1 withObject:@"hanyang"];
// for (int i=0; i<array.count; i++) {
// NSLog(@"%@",array[i]);
// }
// NSString *name = @"hanyang";
// NSUInteger *s = [array indexOfObject:name];//查找元素的下标通过元素
// NSLog(@"%lu",s);
//回顾
/*
数组的初始化:
NSArray *array = [NSArray array];
NSArray *array = [[NSArray alloc]init];
NSArray *array = [NSArray arrayWithObject:@""];
// 回顾:
// 1、不可变数组
数组的初始化
(1)NSArray *list = @[@"",@""];
(2)NSArray *list = [[NSArray alloc]init];
(3)NSArray *list = [NSArray array];
初始化并赋值
(1)只赋一个值NSArray *list = [NSArray arrayWithObject:@""];
(2)初始化 并赋多个值 NSArray *list = [NSArray arrayWithObjects:@"",@"", nil];
注意:最后一个元素的逗号 和 nil 不能省略
*/
/*
数组取值
(1)list[0];
(2)[list objectAtIndex:0];
*/
/*
快速遍历
for (元素类型 *变量名 in 数组) {
}
*/
/*
数组转字符串
(1)直接格式化[NSString stringWithFormat:@"%@",list];
(2)加入一个字符串去分割数组 [list componentsJoinedByString:@""];
*/
/*
把字符串转成数组
通过一个标记 把字符串分割成数组
NSString *ss =@"qqqq11www11eee";
[ss componentsSeparatedByString:@"11"];
*/
/*
可变数组
增删改查
(1)添加[list addObject:@""];
(2)直接删除一个元素:[list removeObject:@""];
通过下标删除元素:[list removeObjectAtIndex:0];
删除最后一个元素:[list removeLastObject];
删除全部元素:[list removeAllObjects];
替换元素:
通过下标 替换下标对应的元素:[list replaceObjectAtIndex:0 withObject:@""];
查找元素:
(1)通过下标:list[0];
(2)通过内容查找:[list indexOfObject:@""];
*/
#pragma mark=====================字典====================================
//字典 没有顺序 不是按顺序排放的
//新华字典 :1、可以根据拼音,根据偏旁,可以查到我们想要的文字解释
//拼音,偏旁 oc中是key 是一个关键字 通过关键字搜索好多内容
//想找的文字解释:值
//NSDictionary 字典 的内容是成对出现的(key:值)
//key 关键字字符串 值只要是object类型都可以
//初始化字典并赋值 用花括号赋值
// 1直接赋值key 不能一样
// NSDictionary *dic = @{@"key":@"值" ,@"key1":@"zhi"};
//用字典 把一个人物的特征表示出来 同一个字典key为唯一的 通过key取值
// NSDictionary *dic = @{@"name":@"笑话",@"age":@"20",@"face":@"帅",@"height":@"1.8米",@"sex":@"男",@"weight":@"50公斤"};
// NSDictionary *DIc = @{@"name":@"gouhua",@"age":@25,@"face":@"bu 帅",@"height":@".8米",@"sex":@"nv",@"weight":@"55公斤"};
/* {
age = 20;
face = "\U5e05";
name = "\U7b11\U8bdd";
}*/
/* NSDictionary *dic = @{@"name":@"笑话",@"age":@"20",@"face":@"帅",@"height":@"1.8米",@"sex":@"男",@"weight":@"50公斤"};
NSDictionary *a = [NSDictionary dictionaryWithObjectsAndKeys:@"zhi",@"key",@"zhi",@"key", nil];*/
//显示出来的内容格式是 用花括号,都有分号 ,都是成对出现的
//取值公式 字典名 中括号里面是key dic[key];
// NSString *name1 = dic[@"name"];
// NSLog(@"%@",name1);
//遍历字典 需要查看字典的内容时 需要知道所有的key
//allkey 获得当前字典的所有key
//allValues 获得当前字典的所有值
// NSArray *array = dic.allKeys;
// for (NSString *key in array) {
// //NSLog(@"%@----%@",key ,dic[key]);
// }
//其他初始化方式
// NSDictionary *di = [NSDictionary dictionary];
// NSDictionary *d = [NSDictionary dictionaryWithObject:@"lai" forKey:@"name"];
// NSDictionary *i = [NSDictionary dictionaryWithObjectsAndKeys:@"zhi",@"key",@"zhi",@"key1", nil];
// NSMutableDictionary *m = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"zhi1",@"key",@"zhi",@"key1", nil];
// NSString *i =[m objectForKey:@"key1"];
// NSLog(@"%@",i);
// for (NSString *key in DIc) {
// NSLog(@"%@----%@",key ,[DIc objectForKey:key]);
// }
// for (NSString *key in DIc) {
// NSLog(@"%@----%@",key ,DIc[key]);
// }
// //初始化并且赋一个值
// NSDictionary *l = [NSDictionary dictionaryWithObject:@"zhi" forKey:@"key"];
// NSLog(@"%@",l);
//可变的字典 不可以直接赋值
//添
// NSMutableDictionary *dic = [NSMutableDictionary dictionary];
// [dic setObject:@"neirong" forKey:@"nei"];
// [dic setValue:@"ne"forKey:@"1"];
//
// //删 如果添加相同的key 会覆盖相同的key的内容
// // [dic removeObjectForKey:@"1"];
//
// [dic removeObjectsForKeys:@[@"1",@"nei"]];//keys 表示key的数组
//
//
// //改 修改就是跟添加一样
// [dic setObject:@"yitian" forKey:@"yigeyue"];
// // NSLog(@"%@",[dic objectForKey:@"yigeyue"]);
// //查 object allkey
// [dic allKeys];
//
/*
回顾:
一、字典:key - 值 对应存在的 数据集合
字典是根据 key 来取值
key 在字典里面 是唯一的
二、字典的赋值和初始化
1、直接赋值
NSDictionary *dic = @{@"key":@"值",@"key1":@"值"};
直接取值:dic[@"key"]
2、初始化
NSDictionary *dic = [[NSDictionary alloc]init];
NSDictionary *dic = [NSDictionary dictionary];
NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"zhi" forKey:@"key"];
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"zhi",@"key", nil];
三、通过方法 取值:
[字典名 objectForKey:@"key"];
获得字典里面所有的值allValues
获得字典里面所有的键allKeys
四、可变字典:
可变字典的初始化 也不可以使用直接赋值@{};
不可变字典的初始化方法 可变字典都可以使用
1、添加一对元素
[字典名 setObject:zhi forKey:key];
2、删除元素
删除一个元素:[字典名 removeObjectForKey:@"key"];
删除多个元素:[字典名 removeObjectsForKeys:key的数组];
删除全部元素:[字典名 removeAllObjects];
3、替换 存在这个key就是替换 就是改变已经有key存在的值,
[字典名 setObject:zhi forKey:key];
4、查找
通过key查找
字典名[key];
[字典名 objectForKey:@"key"];
*/
#pragma mark 第六节 属性构造函数
//属性 某个事物的特征
// - (void)setName:(NSString *)name;
// - (NSString *)gerName;
//setter:设置者
//- (void)setName:(NSString *)name;
//getter:获取者
//setter的公式:
// - (void)set属性名:(属性类型)形参名
//getter的公式:
//-(属性类型) 属性名;
// . 点语法也叫属性 可以通过.属性 赋值 取值
// 属性的公式: 在.h文件中@property 属性的类型 属性名;表示声明属性的方法 以前还要在.m文件 加@synthesize 表示实现属性的方法
//现在@property 包含了声明和实现两部分
//@property 属性的类型 属性名;
//构造方法:init(构造一个对象,对象是个空的)
//自定义 构造方法:
//1.公式:
// -(id)init{
//
// self = [super init];
// if (self) {
//
// }
// return self;
// }
// -(id)initWith 要初始的名字:(数据类型)形参名 要初始的名字:(数据类型)形参名{
//
// self = [super init];
// if (self) {
// _power = power;
//_name = name;
// }
// return self;
// }
//2.本质 就是一个有参数有返回值方法 但是自定义构造函数表示创建一个对象的方法 标识它有特殊意义的符号:(1)方法名 必须用initWith做为开头 并且W大写 (2)方法的实现公式:
// self = [super init];
// if (self) {
// }
// return self;
//为什么要用属性(随时)正向传值 目的是传值 为什么使用自定义构造方法(初始化一个对象)目的是传值 初始化时赋值
// Hero *guanghui = [[Hero alloc]init];
// Hero *shuaiGe = [[Hero alloc]initWithPower:100 name:@"帅哥"];
// NSLog(@"%@",guanghui.name);
// NSLog(@"%d",shuaiGe.power);
// [guanghui setName:@"光辉"];
// [guanghui setInjure:1000];
// [guanghui setBlood:2000];
// [guanghui setDef:300];
// NSLog(@"英雄名字是%@攻击力%d有%d血量防御力为%d",[guanghui getName],[guanghui getInjure],[guanghui getBlood],[guanghui getDef]);
//
// guanghui.name = @"zhubajie";
// // NSLog(@"%@",guanghui.getName);
// NSLog(@"%@",guanghui.name);
// guanghui.injure = 100;
// guanghui.blood = 1000;
// guanghui.def = 200;
//
//
// Flower *meigui = [[Flower alloc]init];
// Flower *guiHua = [[Flower alloc]init];
// Flower *meiHua = [[Flower alloc]init];
//
// meigui.pinzhong = @"珍贵";
// meigui.color = @"红色";
// meigui.smell = @"十里飘香";
// meigui.price = 200;
//
//
// guiHua.pinzhong = @"普通";
// guiHua.color = @"白色";
// guiHua.smell = @"百里飘香";
// guiHua.price = 100;
//
//
// meiHua.pinzhong = @"稀有";
// meiHua.color = @"黄色";
// meiHua.smell = @"千里飘香";
// meiHua.price = 50;
/*
花类:品种 颜色 价格 气味
3种花:1、玫瑰花 2、桂花 3、梅花
*/
// NSArray *flowerDatas = @[@{@"name":@"玫瑰",@"price":@99,@"color":@"红色",@"flavour":@"很香"},@{@"name":@"桂花",@"price":@90,@"color":@"黄色",@"flavour":@"漫天香"},@{@"name":@"梅花",@"price":@100,@"color":@"红色",@"flavour":@"不是很香"}];
//
// NSMutableArray *flowers = [NSMutableArray array];
// for (int i = 0; i<flowerDatas.count; i++) {
// Flower *flower = [[Flower alloc]init];
// flower.name = flowerDatas[i][@"name"];
// flower.price = [flowerDatas[i][@"price"] intValue];
// flower.flavour = flowerDatas[i][@"flavour"];
// flower.color = flowerDatas[i][@"color"];
// [flowers addObject:flower];
// }
//
// for (Flower *flower in flowers) {
// NSLog(@"%@ %@ %@ %d",flower.name,flower.flavour,flower.color,flower.price);
// }
#pragma mark 第七节 继承,封装,多态 -> 面向对象语言的三大特征
//oc->多继承?没有多继承只能多级继承 cage
// 封装就是把所有共性的东西放到一起(类的特征放在一个类的)
//封装的好处:代码清晰,模块化 方便使用 减少代码量,复用性高 便于维护
//继承:子类,父类
//1.父类有的方法 子类可以使用
//2.父类的属性 子类可以使用
//父类所有公开的方法和属性,子类都可以使用
//子类独有的方法属性,父类不能使用
//同一种方法不同的实现叫多态
//不知道具体对象名时,可以用self代替
// YellowPerson *xiaoYang = [[YellowPerson alloc]init];
// [xiaoYang eat] ;
// xiaoYang.color = @"黄色皮肤";
// BlackPerson *Bruce = [[BlackPerson alloc]init];
#pragma mark 第八节 内存管理
//?学习内存管理 因为一个app超过30M,系统会向app 放送memory warning消息,接到这个信息又不该正,则苹果系统会让这个app出错 或者泄露 或者崩溃
//程序运行时,内存空间是有限的,oc所编写的程序需要实例化对象,对象要占用内存,如果创建对象,而不去释放内存,将发生内存泄露。需要手动管理内存。
//管理内存:1.分配内存2.释放内存(谁分配谁释放)
//在不需要这个对象时,及时消掉就可以防止内存泄露(光分配不释放)
//不知道怎么判断是否释放一个对象? 引用计数:判断一个对象是否存在的标准 公式:对象名.retainCount
//什么样的数据需要我们手动管理内存 基本数据类型(不能成为对象,单一的一个数据,字母、数字)不用我们手动管理,是系统自动处理 栈(系统自动开辟的内存分配到栈) 除了基本数据类型都需要手动管理内存(程序员管理) 堆(程序员开辟的内存分配到堆)
// int a= 1200;分配到栈
// Person* b = [[Person alloc]init];分配到堆
//retainCount 引用计数>0时,就是对象存在的时候 当<0说明这个对象已经被释放了
//生命周期:1.创建的时候(alloc)就是对象存在的时候 2.具体对对象的操作 3.释放对象
//引用计数是判断一个对象是否存在的标准(>0)
//让引用计数+1的方法:
//1.alloc new(创建)
//2.retain (保留)
//3.copy(拷贝)
//让引用计数-1的方法:
//release (释放)
//autorelease(延迟释放)
//MRC 手动管理引用计数
//ARC 自动管理引用计数
//对象被释放的时候会调用一个销毁的方法delloc——>销毁对象
//有一个alloc,retain,copy 就要对应有一个release才能释放对象
//retain 给同一个对象保留引用计数
//目的为了保证一个不会被释放掉 给这个对象引用计数+1
// Person *person = [[Person alloc]init];
// Person *p =[person retain] ;
// //如果一个对象被释放掉 这个对象就是野指针 为了防止使用野指针 可以在这个对象释放后赋值为nil
// // NSLog(@"%ld",p.retainCount);
// [person release];
// person= p;
// NSLog(@"%ld",person.retainCount);
return 0;
}