深拷贝和浅拷贝:
浅拷贝:浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间
深拷贝:深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。
retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,引用计数每次加一。始终返回一个不可变对象。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。
结构体NSRange:
struct的几种定义方式:
1、struct myStruct{
int x,y,z;
};
2、struct myStruct{
int x,y,z;
}stru;//说明:已经定义了一个myStruct的实例变量stru。
3、typedef struct myStruct{
int x,y,z;
}; 或者
typedef struct {
int x,y,z;
}myStruct;
4、typedef struct _myStruct{
int x,y,z;
}mystruct;//说明:mystruct是myStruct的别名,在使用时可以省去struct
第1、2、3种定义方式都可以通过struct myStruct 定义myStruct的实例变量。第二种定义方式,已经存在实例变量stru,可以直接通过stru.x或者struc.y访问x、y。第四种定义方式,可以通过mystruct struct1定义实例变量
字符串:
(创建)stringWithFormat方法是通过格式字符串和参数来创建字符串
(大小)NSString的length返回的是字符串的字符个数,而strlen()返回的是只计算字节数的函数,可能会返回错误的数值。
(比较)NSString下面的compare函数的返回值是一个枚举类型NSComparisonResult;
返回值类型是枚举类型,若右侧的字符串中字母表中排序较左边靠后,如“aadrdv”和“zzgote”,则返回NSOederedAscending,否则返回NSOrderedDescending,相同返回NSOrderedSame
Enum{
NSOrderedAscending = -1,
NSOrderedSame, //相同
NSOrederedDscending
};
Type NSInteger NSComparisonResult;
比较两个字符串相等时用isEqualToString
==用来检查两个对象是否为同一个事物对象
NSCaseInsensitiveSearch:不区分大小写的字符串
NSListerlSearch:进行完全比较,区分大小写
NSNumricSearch:只比较字符串的个数,不比较数值
NSString为不可变类型,NSMutableString为可变类型,类似于java中的String和StringBuffer
NSMutableString可以用stringWithCapacity创建
+(id) stringWithCapacity:(NSInteger) capacity;
集合:
数组
NSArray是用来存储对象的有序列表,可以存放任意的对象,不能用来存储基本数据类型的值:int,float,struct,enum等
两个限制:只能存储Objective-C对象
不能存储nil值,因为Array数组会值列表结尾添加nil代表列表的结束
如:NSArray *array = [NSArray arrayWIthObjectives:@“one”,@“two”,nil];
NSArray *array2 = @[@“one”,@“two”];(字面量方式创建,等同array的创建)
NSString *str1 = @“hello:World:happy:everyday:!”;
使用componentsSeparatedByString函数,可以将字符串切分成NSString
NSArray *chunks = [str1 componentsSeparatedByString:@":"];
使用componentsJoinedByString函数来合并NSArray中的元素并创建字符串
str1 = [chunks componentsJoinedByString:@":–”];
NSArray为不可变类型,NSMutableArray为可变类型
NSMutableArray可以用arrayWithCapacity创建
+(id)arrayWithCapacity:(NSInteger) numItems;
枚举
可以利用枚举器NSEnumerator遍历数组
快速枚举:
for(NSString *string in chunks){
NSLog(@“I found %@”,string);
}
四种遍历方式:通过索引,使用NSEnumerator,使用快速枚举和最新的代码块
字典
NSDictionary是以键值对的方式存储数值,虽然是不可变类型,但可以直接随意添加的删除字典元素如: NSDictionary *numbers = [NSDictionary dictionaryWithObjectsAndKeys:
@“1”,@“one”,
@“2”,@“two”,
@“3”,@“three”,
nil];
或者用字面量的方式:
NSDictionary *number = @{@“one”:@“1”,@“two”:@“2",@“three”:@“3"};
若查询:
-(id)objectForkey:(id)key;或number[key];
NSNumber和NSValue
由于NSArray和NSDictionary只能存储OC对象,不能存储基本数据、struct。但有时我们需要存储时可以将其封装成对象用到NSValue,NSNumber是NSValue的子类。又称为装箱操作
装箱:把一个基本类型的数据封装成对象的过程。
开箱:从一个对象中提取出基本数据类型
NSNull
集合中不能存放nil值,因为nil在NSArray和NSDictionary中有特殊含义,但有时确实需要存储一个表示“空”的值,那么可以使用NSNull,它是NSObject的子类。只有这么一个方法。
- (NSNull *)null
NSNull *nl = [NSNull null];
这样就可以将nl存入数组和字典中了。
[NSNull null]总是返回一样的数值所以可以使用==将该值与其他值进行比较。