【字段的权限】
【注】在类中声明字段,可以为字段添加权限
@private 私有权限
@protected 保护权限
@public 公有权限
@interface Father : NSObject
{
@private //私有权限修饰的变量,不能被子类继承,不能被外部函数访问。
int a;
@protected //缺省权限 保护权限修饰的变量,可以被子类继承,不能被外部函数访问。
int b;
int c;
@public //公有权限修饰的变量,可以被子类继承,可以被外部函数访问。
int d;
}
@end
father->d = 9;
//保护成员,被继承了,仍然是保护成员
//公有成员,被继承了,仍然是公有成员
【注】
//实际工作中,根本不需要使用权限,都使用缺省的保护权限就可以了。
//如果你想要成员变量被外部函数访问,声明成属性。
//如果你想变量不被子类继承,不对外公开。声明在实现里。
@implementation Father
{
int x;
}
【方法的权限】
【注】
//OC中成员方法都是公有的,可以被继承,可以被外部方法访问。
//没有在接口中做声明的方法,这个方法不能被外部函数直接访问。
//通过不声明(或者仅在匿名类别中声明),我们模拟了私有方法,这个过程,有时被称为方法的私有化。
【注】下面情况,方法私有化不成功
1.父类公有的方法,子类重写,即使子类不声明,方法也是公有的。
2.在协议中声明的方法,遵从协议的对象,即使不声明,只实现,方法也是公有的
【另】方法的私有化,声明即外露,不声明即不外露,本没什么可记的。但是面试经常会被问到:OC能实现私有方法吗?可照上述方式回答。
【字符串】
【注】OC的程序,依托于基础类库Foundation.Foundation框架提供了很多官方类,其中有三个基础的数据结构。
【字符串】【数组】【字典】
堆中字符串 链表 哈希表
【注】OC兼容C的字符串,但是OC有自己的字符串,是一个类。声明的对象,既能存储一串字符,又能通过一些方法,管理存储的字符。
【另】OC程序乃至iOS程序中,所有的字符串管理,都交给这个类完成。
一.NSString(NextStep-> Cocoa)
二.字符串的常用方法
//字符串转其他类型数据
int ret = [str1 intValue];
long long ret2 = [str1 longLongValue];
double ret3 = [str1 doubleValue];
NSInteger ret4 = [str1 integerValue];
1.返回字符串的长度
NSUInteger len = [str length];
2.返回单个字符
unichar c = [str characterAtIndex:3];
3.比较两个字符串的大小关系
BOOL ret = [str1 isEqualToString:str2];
NSComparisonResult ret2 = [str1 compare:str2];
4.查找子串的位置和范围
NSRange range = [str rangeOfString:@"粉刷"];
5.子串的提取
NSString * subStr1 = [str substringToIndex:5];
//开区间
NSString * subStr2 = [str substringFromIndex:5];
//闭区间
NSString * subStr3 = [str substringWithRange:range];
//提取字符串
//NSString不可修改,因此这里并不是截断字符串,只是取出原字符串的一部分,创建一个新的字符串,新字符串是原字符串的一部分,称为原字符串的字串
四.可变字符串
NSMutableString 继承自 NSString
1.凡是NSString的方法,NSMutableString都能用
2.凡是传参需要传入NSString * 传入NSMutableString *也行
【专有方法】
1.重置字符串内容
[str setString:@"0123456789"];
2.增 append insert
[str appendString:@"9876543210"]; 追加
[str appendFormat:@"%d %c %.2f", 34, ‘T‘, 2.34];
[str insertString:@"ABC" atIndex:3];
[str insertString:[NSString stringWithFormat:@“%.2f”,3.14] atIndex:3];
3.删 delete
[str deleteCharactersInRange:range];
4.改 replace
[str replaceCharactersInRange:range withString:@"XXXXXXXXXXXXXXX"];
//替换之前的字符串个数和替换之后的个数,长度可以不同。因为可变字符串是堆空间的对象,堆空间的大小可在运行时改变。
5.查 rangeOfString:
【数组】
//OC的数组用于存储对象的地址,结构更接近于C中的链表。
//OC使用C的数组存储大量的基础数据类型,OC的数组对象存储多个对象(地址)
//OC的数组类有两个
NSArray(数组) NSMutableArray(可变数组)
//作用管理大量的对象数据。
一.NSArray
【创建数组对象】
NSArray * array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", dog, nil];
//构造方法的参数是任意对象的地址,不局限字符串。
//每个对象可以是不同类的对象。
//nil就是NULL NULL表示一般指针为空,nil表示对象指针为空。
//数组中只存储每个对象的地址,并不真的存储对象。
//所以,一个对象经常被添加到多个数组中,但还是一个对象。
//类似 void * array[n];
//用initWithObjects需要在末尾添加nil
//%@是打印任何对象
NSArray * array2 = @[@"One One", @"Two", @"Three", dog];
//Xcode 4.6 以后才能用
//打印数组,就是打印数组的每个元素
NSLog(@"%@", array);
【遍历数组】
//找出数组中元素个数
NSUInteger cnt = [array count];
//找到某个元素,返回某个元素的地址。
NSString * obj = [array objectAtIndex:1];
obj = array[1];
//xcode 4.6 以后
//直接打印数组不支持中文,先取出后打印支持中文
//id表示指向任何类型的指针,即泛型对象指针
//快速枚举法
for(id obj in array){
//循环的第一次obj指向数组第0个元素,第二次指向数组第1个元素。遍历结束后,会自动退出
NSLog(@“%@“,obj);}
//如果使用快速枚举法,则遍历过程中,不得修改数组元素个数和元素的顺序
【详见day3-数组-2】
//判断一个对象是否属于某个类
[obj isKindOfClass:[DeathKnight class]] == YES;
【常用方法】
//返回某个对象的位置(索引)
NSUInteger index = [array indexOfObject:dk2];
二.可变数组
//NSMutableArray : NSArray
//凡是NSArray的方法,NSMutableArray都能用。
//凡是传参传NSArray*,也可以传NSMutableArray*
//重置内容
[array setArray:@[@"One", @"Two"]];
//增
//追加
[array addObject:@"Four"];
//插入
[array insertObject:@"Four" atIndex:1];
//删
[array removeAllObjects];
[array removeLastObject];
//删除指定索引处元素
[array removeObjectAtIndex:1];
[array addObject:@"One"];
//传入地址,删除指定元素,如果传入的是字符串,删除所有和字符串相等的元素。
[array removeObject:@"One"];
//删除指定的对象,如果对象是一般对象,则需传入你想删除的对象的地址。如果对象是字符串,则只需传入跟你想删除的字符串相等的字符串即可
//改
//用某个对象,替换当前某索引处的元素
[array replaceObjectAtIndex:0 withObject:@"Five"];
//交换两个元素的位置
[array exchangeObjectAtIndex:0 withObjectAtIndex:2];
三.字符串分割
【字典】
//NSDictionary 和 NSMutableDictionary
//NSMutableDictionary : NSDictionary
//两个凡是
一.NSDictionary
//创建字典对象
//字典中的数据以键值对的形式存储
//@"One”是键值对的值(value), @“1”是键值对的键(key)
//字典的值是任意对象,键一般使用字符串
//字典的目的是通过键找到值。键是手段,值是目的。值是需要存储的数据,键仅仅是查找数据的索引
//字典采用哈希表存储数据,因此查找速度快,没有顺序,不存在第一键值对,第二键值对
//通过键计算一个哈希值,比如5,则将对应的值的地址存在哈希表的第5个格子里
//OC的字典不允许两个键值对拥有相同的键
//字典和数组一样,只储存对象的地址,不储存对象本身
NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"One", @"1", @"Two", @"2", @"Three", @"3", @"One", @"4", nil];
NSDictionary * dict2 = @{@"1" : @"One", @"2" : @"Two", @"3" : @"Three"};
//通过传入键,返回值的地址
NSString * value = [dict objectForKey:@"3"];
value = dict[@"3"];
//Xcode 4.6 以后
//如果没有对应的键,返回nil
//返回键值对总数
NSUInteger count = [dict count];
//返回所有的键
NSArray * keys = [dict allKeys];
//返回所有的值
NSArray * values = [dict allValues];
二.可变字典
//重置字典
[mutableDict setDictionary:@{@"1" : @"One", @"2" : @"Two", @"3" : @"Three"}];
//增
[mutableDict setObject:@"Four" forKey:@"4"];
//删
//通过键删除值
[mutableDict removeObjectForKey:@"3"];
//通过多个键,删除多个值
[mutableDict removeObjectsForKeys:@[@"1", @"2", @"3"]];
//删除所有键值对
[mutableDict removeAllObjects];