版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CYXLZZS/article/details/43834949
oc学习总结(二)
7、内存管理
》以下两种情况发生时,所有者对象将会获得该对象的所有权
创建或者复制对象:alloc, allocWithZone:, copy, copyWithZone:, mutableCopy, mutableCopyWithZone:
保留对象:retain
》在不需要时所有者对象必须释放对该对象的所有权
release, autorelease
》release的一些场景
1、alloc后不用时
2、数组的addObject后
3、对象持有其他对象所有权时的dealloc方法中
8、点语法
》赋值
assign:直接赋值(相当于一个别名),default。
retain:保留对象,两个对象指向同一内存区域
copy:拷贝对象,开辟新空间。指向不同内存空间。有时相当于retain。必须实现NSCopying协议
》读写性
readwrite:生成getter和setter,default
readonly:只有getter
》原子性(多线程环境下)
nonatomic:不锁定,
atomic:锁定,线程保护,default
9、文件管理
》NSFileManager
文件(目录)的创建,删除等操作,构造方法[NSFileManager defaultManager]
》NSFileHandle
文件内容的创建,修改等操作,可以创建分别用于读、写和修改的handle对象
10、NSTimer定时器
》常用方法
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti
target:(id)aTarget selector:(SEL)aSelector
userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
ti:间隔时间,秒数
target:selector所属对象
selector:间隔执行方法,一般包含一个NSTimer参数timer,可以将当前创建的NSTimer传递给该方法
userInfo:一般用于传递参数给selector,取出timer.userInfo
repeats:是否重复执行
》在控制台程序中,为避免main函数过早return后,定时器无法起作用,
这时必须使用[[NSRunLoop currentLoop] run]来使程序一直运行起
11、对象的深浅拷贝
》拷贝必须实现拷贝协议NSCopying和NSMutableCopying,实现copyWithZone方法
》copy和mutableCopy都是NSObject中的方法,调用时会调用NSCopying协议中得copyWithZone方法
》Foundation框架中,当copy的是一个不可变对象时,相当于retain(cocoa做得内存优化)
mutableCopy或者是可以变对象的copy都是拷贝一个新对象
》浅拷贝:只拷贝对象本身,不拷贝对象的属性;深拷贝:拷贝对象包含的属性;Foundation中支持拷贝的对象
都只是浅拷贝,包括NSNumber,NSArray,NSString,NSDictionary,NSMutableArray,
NSMutableDictionary,NSMutableString
12、对象的归档
》归档NSKeyedArchiver,可以指定key来序列化多个对象在同一个文件中
》解归档NSKeyedUnarchiver
》对象必须实现NSCoding协议才能进行归档和解归档
- (void)encodeWithCoder:(NSCoder *)aCoder; 归档
- (id)initWithCoder:(NSCoder *)aDecoder; 解归档
13、 单例模式
》应用场景
1、保存全局数据
2、重量级对象:初始化耗费资源的对象,提高效率
》单例对象的创建
1、定义一个静态全局值为nil的对象 static AppManager *manager = nil;
2、定义一个类方法创建对象 + (id)shareManager;
+ (id)shareManager{
//此处必须加线程保护,防止多线程环境中创建出多个实例
@synchronized(self){
if(manager==nil){
manager = [[AppManager alloc] init];
}
}
return manager;
}
3、覆盖+ (id)allocWithZone:(NSZone *)zone;方法,防止直接调用alloc方法创建出新的对象
4、覆盖- (id)copyWithZone:(NSZone *)zone;方法,防止调用copy(返回静态实例)方法创建出新对象
5、覆盖release(不做任何操作),autorelease(返回静态实例)方法,防止对象的销毁
6、覆盖retain方法,返回静态实例
7、覆盖retainCount方法,直接放回UINT_MAX