//实例变量可见度分为三种
/**
* 1、@public 公开的,实例变量既可以在类的外部 也可以在类的内部进行访问。简单的说,就是任何文件中都能访问,所以实例变量的安全性就会变得非常低,不建议采用,违背了OC中封装的特性。
2、@protected 受保护的,实例变量只能在本类以及子类中进行访问,是实例变量的默认可见度,也是我们以后用的可见度。
3、@private 私有的,实例变量只能在类的内部进行访问。不对外公开。
*/
//给实例变量赋值的方法
//此方法的功能 是为_name 实例变量赋值,因此参数类型 应该与 实例变量_name类型一致,为NSString *类型。
//因为仅仅是赋值操作,所以,不需要有返回值,所以返回值类型为void
//因为设置实例变量是每个对象的功能,并且类方法中不能访问实例变量,所以此方法是实例方法,- 方法。
//方法名的写法与函数名是一样的,第一个单词小写,剩下的单词首字母大写,采用驼峰法。
//实例变量的setter方法,书写格式 - (void)setXxxx:(实例变量类型)xxxx.
//其中Xxxx为实例变量名去掉下划线。
- (void)setName:(NSString *)name;
//获取实例变量值的方法
//因为是获取值,所以有返回值,返回值类型与你获取的实例变量类型一致。
//因为是获取值,所以不需要有参数。
//因为取值是每个对象的功能,并且类方法内部也不可以访问实例变量,所以此方法为对象方法,- 方法。
//自定义初始化方法
//什么时候需要定义一个初始化方法?
//1、父类里面的初始化方法无法满足 初始赋值 的需求。比如NSObject类里面有一个init方法,但是这个方法做了一个空操作,不能为我们的实例变量进行赋值。
//2、重写父类的初始化方法init 只能给实例变量设置固定值,不够灵活。
//3、当我们要给某些实例变量赋初始值,但是当前没有这样的初始化方法时,就需要我们自己定义初始化方法,完成需求。
//4、一个类可以有多个初始化方法,初始化方法也是方法,可以没有参数也可以有多个参数。
/**
* 注意:初始化方法的特点
1、初始化方法是 实例方法 -
2、初始化方法的返回值是id 或者 instancetype,id和instancetype是一个意思,都表示泛型(对象类型)。只不过在iOS7之前使用id,iOS7之后使用instancetype,instancetype更加见名知义
3、初始化方法以init开头。可以无参数 也可以有多个参数,根据需求来定
4、初始化方法只会执行一次,因为初始化方法都会与alloc连用,而只要执行了alloc方法,就相当于在堆区域重新开辟一个空间来存储对象,所以对象不一样了。
把重复的代码写到一个方法内部,然后去接收这个方法消息。
//在类的内部,接收其他的消息方法,使用self
// self就代表外界创建好的实例对象。
//@class的作用:告诉编译器 从这一行开始,Student1 只是一个类名。把之后出现的 Student1当作类名看待即可。
//能有效的避免循环导入头文件。
//Student1里面有什么实例变量,有什么方法 完全不知道,只知道Student1是一个类。
//如果 真的需要循环导入头文件的话,.h文件中通过@class标识类名之后,在.m文件中还是需要#import将类中的内容导入过来的。
//便利构造器,封装了alloc、初始化方法,代码更加简洁
//类方法,执行方法的为类名,得到的是当前类的实例,便利构造器方法名以类名开头。
//如果子类重写了父类的某个方法,应该在子类的.h中声明出来 重写的方法。这样别人就会知道这个方法是重写父类的。
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender school:(NSString *)school number:(NSString *)number {
//初始化继承过来的实例变量
// [self setName:name];
// [self setAge:age];
// [self setGender:gender];
//完整的初始化方法
//1、先将从父类中继承过来的实例变量进行初始化赋值,想super发送父类中的初始化方法。
self = [super initWithName:name age:age gender:gender];
//2、将本类中独有的实例变量进行初始化赋值,完成对所有实例变量的初始化赋值
if (self) {
//初始化自身的实例变量
[self setSchool:school];
[self setNumber:number];
}
return self;
}
- (void)sayHi {
NSLog(@"你好啊");
[self setNumber:@"741"];//执行本类的方法使用self关键字。向谁发送消息,谁接到到消息,并且执行了方法,谁就是self。
//如果说一个子类重写了父类的某个方法A,那么在子类中,关于A方法就有两套实现,一个重写之前的,一个是重写之后的。
//如果说 想要执行重写之前的A方法 也就是父类中的A方法,有两种途径:
/**
* 1、在子类中,使用super关键字,执行A方法,super并不是对象,而是编译器指令,发送消息给super,执行的是父类中的方法,并不是父类对象去执行方法。
2、不重写A方法。
*/
[super sayHi];//此时sayHi方法执行的就是 父类中的sayHi方法。
//[self sayHi];//这是极其错误的写法,出现了致命的递归。
//super除了可以执行重写之前的方法,还可以去执行父类的其他方法。只要是父类继承过来的方法,无论是否重写过,都可以通过super这个关键字执行。如果没有重写方法,那么此时通过super和self执行的方法都是父类中的,因为子类找不到方法的实现,会往上查找父类是否有实现。
[super eat];
}
#pragma mark -----创建字符串对象的方法-----
/*
//涉及到的内存区为栈区和常量区
NSString *str = @"xxx";
//1
NSString *str1 = [[NSString alloc] initWithFormat:@"xxx"];
//2
NSString *str2 = [[NSString alloc] initWithFormat:@"name is %@, age is %d",str, 18];
NSLog(@"%@",str2);
//字符串的便利构造器
NSString *str3 = [NSString stringWithFormat:@"juju is beautiful"];
*/
#pragma mark -----字符串功能方法----
/*
//1、获取字符串的长度
NSString *str = [[NSString alloc] initWithFormat:@"name is %@",@"ffff"];
//length 是 字符串类的一个属性,默认的getter方法名称是 length,所以对象执行length,就可以获取字符串长度。
NSUInteger strLength = [str length];
NSLog(@"%lu",strLength);
//2、截取字符串
//(1)、从第一个字符开始截取到指定字符。
NSString *resultStr = [str substringToIndex:5];
NSLog(@"%@",resultStr);
//(2)、从某个字符开始截取到最后一个字符
NSString *resultStr1 = [str substringFromIndex:5];
NSLog(@"%@",resultStr1);
//(3)、截取中间某一段字符串
//第一种 取范围的方法 NSMakeRange(下标, 长度)可以获取某个范围。
NSString *resultStr2 = [str substringWithRange:NSMakeRange(5, 2)];
NSLog(@"%@",resultStr2);
//第二种,先创建一个NSRange的结构体变量,当作参数传进去
NSRange range = {5, 2};
NSString *resultStr3 = [str substringWithRange:range];
NSLog(@"%@",resultStr3);
//3、拼接字符串
NSString *newStr = [str stringByAppendingString:@"girl"];
NSLog(@"%@",newStr);
NSString *newStr1 = [str stringByAppendingFormat:@"%@",@"girl"];
NSLog(@"%@",newStr1);
//4、替换字符串
NSString *replaceStr = [str stringByReplacingOccurrencesOfString:@"ffffff" withString:@"2222222"];
NSLog(@"%@",replaceStr);
//5、判断两个字符串是否相等
NSString *sourceStr1 = @"def";
NSString *sourceStr2 = [[NSString alloc] initWithFormat:@"abc"];
BOOL isEqual = [sourceStr1 isEqualToString:sourceStr2];
NSLog(@"%d",isEqual);
*/
//6、字符串比较
/**
* 1、升序NSOrderedAscending -1 前面的字符串小于后面的字符串
2、降序NSOrderedDescending 1 前面的字符串大于后面的字符串
3、相等NSOrderedSame 0 前面的字符串与后面的字符串相等
*/
/*
NSComparisonResult compareResult = [sourceStr1 compare:sourceStr2];
NSLog(@"%ld",compareResult);
//7、判断是否以某个字符串开始,判断是否以某个字符串结尾
//name is 菊菊
BOOL isPre = [str hasPrefix:@"name"];
NSLog(@"%d",isPre);
BOOL isSuf = [str hasSuffix:@"菊菊"];
NSLog(@"%d",isSuf);
*/
/**
给定一个图片文件名,判断字符串中是否以“png”结尾,如果是就替换成“jpg”,如果不是,就拼接”.jpg”。
*/
// NSString *picture = [[NSString alloc] initWithFormat:@"juju.png"];
// if ([picture hasSuffix:@"png"]) {
// NSString *str = [picture stringByReplacingOccurrencesOfString:@"png" withString:@"jpg"];
// }else {
// NSString *str = [picture stringByAppendingString:@"jpg"];
// }
/*
NSString *str1 = [[NSString alloc] initWithFormat:@"name is 菊菊 boy"];
//按照某个字符串进行分割,得到多个字符串。
NSArray *array = [str1 componentsSeparatedByString:@" "];
NSLog(@"%@",array);
*/
#pragma mark -----可变字符串-----
/*
//创建一个可变字符串对象
NSMutableString *mStr = [[NSMutableString alloc] initWithCapacity:0];//一般给0,是动态分配内存大小的。
//设置字符串
[mStr setString:@"name is juju"];
NSLog(@"%@",mStr);
//拼接字符串
[mStr appendString:@"girl"];
NSLog(@"%@",mStr);
//替换字符串
[mStr replaceCharactersInRange:NSMakeRange(5, 2) withString:@"isNot"];
NSLog(@"%@",mStr);
//删除某段字符串
[mStr deleteCharactersInRange:NSMakeRange(5, 5)];
NSLog(@"%@",mStr);
*/
#pragma mark -----数组-----
//创建一个不可变数组对象
//nil不是对象,作用是:标记数组的赋值结束。
NSArray *array = [NSArray arrayWithObjects:@"name", @"is", @"juju", nil];
//获取数组元素个数
NSUInteger count = [array count];
NSLog(@"%lu",count);
//获取数组中的元素,也就是保存的对象
NSString *str = [array objectAtIndex:0];
NSLog(@"%@",str);
NSLog(@"%@",array[1]);
NSLog(@"%@",[array lastObject]);
//遍历数组的方法
for (int i = 0; i < [array count]; i ++) {
NSLog(@"%@",[array objectAtIndex:i]);
}
// [array objectAtIndex:0] = @"gend";
//创建一个可变数组对象
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"name", @"is", @"juju", nil];
NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:0];
//添加元素,addObject,添加的元素(对象)在数组最后面
[mArray addObject:@"girl"];
//插入元素
[mArray insertObject:@"gender" atIndex:1];
//删除元素
[mArray removeObjectAtIndex:2];
//交换两个下标上的元素
[mArray exchangeObjectAtIndex:0 withObjectAtIndex:2];
NSLog(@"%@",mArray);//直接打印可以
for (int i = 0; i < [mArray count]; i ++) {
NSLog(@"%@",[mArray objectAtIndex:i]);
}//遍历也可以
//将一个数值转换成一个 对象,对象采用字符串
NSInteger a = 10;
NSString *str1 = [[NSString alloc] initWithFormat:@"%ld",a];
[mArray addObject:str1];
//值对象NSNumber
int x = 100;
NSNumber *number = [NSNumber numberWithInt:x];
[mArray addObject:number];
//将对象类型转换成基本数据类型
NSLog(@"%ld",[[mArray objectAtIndex:4] integerValue]);
NSLog(@"%d",[[mArray objectAtIndex:5] intValue]);
//数值不能直接存入数组,因为数组中存储的元素必须是对象
//将一个数值存入数组采用 numberWithxxx方法,根据你数值的类型决定方法名
//从数组中取出对象之后,采用xxxValue可以将对象转换成我们最初的数值,参与运算。
return 0;
}