ObjC类与属性的copy关键字

1. NSFileManager类管理文件系统

作用:进行常见的文件操作(拷贝,创建等);
特点:单例模式,不需要NEW对象获取;

NSFileManger *fm=[NSFileManger defaultManger];///获取此类对象

功能:

  1. 判断文件是否存在.根据路径是否存在.-(BOOL)fileExistsAtPath:路径;
  2. 判断文件是否一个目录:fileExistsAtPath:路径 is Director:BOOL
  3. 判断文件是否可读:-(BOOL)isReadableFileAtPath: ;
  4. 判断是否可写:-(BOOL)isWriteableFileAtPath: ;
  5. 文件访问:
  6. 获取文件信息:-(NSDictionary*)attributesOfitemAtPath:路径 error:nil
  7. 获取指定目录子目录-递归:-(NSArray*)subpathsAtPath:路径;
  8. 子目录-非递归:-(NSArray*)subpathsOfDirectorAtPath:// error:nil;
  9. 子目录-不包含后代元素:-(NSArray*)contentOfDirectoryAtPath:/ error:nil;
  10. 文件操作:

  11. 创建:-(BOOL)creatFileAtPath:路径 contents:内容 attributes:属性;(内容:NSData类型)

  12. creatDirectoryAtPath:路径 withIntermediateDirctories:YES/NO (YES表示创建过程目录,NO即不自动创建) attributes:属性信息 error:错误信息对象
  13. 拷贝文件:-(BOOL)copyItemAtPath:源文件路径 toPath:新 error:错误信息对象
  14. 移动文件:-(BOOL)moveItemAtPath: topath: error:
  15. 删除文件:-(BOOL)removeItemPath: error:

2.沙盒

1.文件下载思路:
客户端发送请求->服务器响应,返回NSData->客户端接受数据;
2.沙盒机制(sandbox):每个iOS应用都有自己的应用沙盒,即文件系统目录.属于封闭式的,所有APP都在单独的沙盒中运行;为了:1⃣️完美的用户体验需要对跨应用程序进行整合统一;2⃣️封闭跨应用可以保证系统的安全性;(iOS8以后开放了几个固定的系统区域,例如第三方图片编辑,第三方输入法等)

应用沙盒一般包括:

  • Documents:保存应用运行时生成需要的持久化数据iTunes会备份.
  • tmp:临时数据.应用完毕会删除.
  • library/Cache:缓存文件,不备份不自动删除.
  • Library/Preferences:保存应用偏好设置.会备份.

3.获取沙盒路径:

  • 获取根路径:NSHomeDirectory()的返回值;
  • 获取tmp路径:NStempoaryDirectory();
  • 获取Documents路径:常用方式—使用字符串拼接=>根目录+Documents;还记得么stringByAppendingPathComponent:@”Documents”
    非常用方式:搜索模式=>-(NSArray)NSSearchPathForDirectors(目录1,目录2….,YES)之后获取返回数组的最后一个元素即事所求路径;

3.OC中常见结构体:

NSRange范围,NSPoint/CG二维坐标,NSSize/CGSize 大小,NSRect/CGRect 二维矩形区域.

NSPoint和CGPoint同义,前者是后者别名;
此类结构体有专门的打印NSLog方式:
NSLog(@"%@"NSStringFromPoint( ));//Point换 新增快速赋值方式:NSPoint=NSMakePoint(x,y);/CGPoint=CGPointMake(x,y) //其他结构体赋值方式类似

  • CGPoint结构体成员表示点.double的(x,y)
  • CGSize成员表示长和宽,double型
  • CGRect成员为CGPoint和CGSize
  • NSRange前面说过,成员表示位置和长度;

4.NSNumber类

由于NSArray和NSDictionary等集合只能存放对象,不能存基本数据类型.所以OC中构建了NSNumber类来包装基本类型成对象;
作用:封装.

+(NSNumber*)numberWithInt:  ;    
//int可换成其他基本类型保留字

此方法简写:@常量/@(变量)
例:NSSArray *arr=@[对象1,对象2,
@(a),@15];
取回用 -(int)intValue等方法即可

5.NSValue

NSNumber的父类,用于指针.结构体的对象包装.
1⃣️,结构体包装:常用:

+(NSValue*)valueWithPoint:(NSPoint)point
+....size
+...rect

取回-(NSPoint)pointValue:  ;
...

对于自定义结构体:

+(NSValue*)valueWithBytes:结构体指针(地址) objCType:@encode(类型描述符)

6.NSDate时间

常用方法:

  1. 获取当前时间:[NSDate date];
  2. 格式化时间():stringFromDate
  3. 计算时间:+(instancetype)dateWithTimeIntervalSinceNow: ;
  4. NSCalendar日历处理类结合:NSCalendar * cal=[NSCalendar currentCalendar];
    [cal components:要获取的内容 fromDate:从哪个时间对象]

7.集合对象的内存管理

**add一个对象到集合中,那么该对象的引用计数器+1;
当集合被销毁时,会向集合中元素发送release消息;
创建集合时方法里调用了//autorelease方法释放池结束…**

8. copy/MUtableCopy

目的:copy某个对象数据,使在修改时互不影响.
前提:自定义对象所属类必须遵守NSCopying协议.才能copy;使用时系统会默认调用此协议的方法copyWithZone;

@protocol NSCopying
-(id)copyWithZone:(NSZong*)zone;
@end
实现:
-(id)copyWithZone:(NSZong*)zone{
//1.产生新对象
Person *p=[Person new];
//2.把源对象中的属性值都拷贝到新对象中
p.name=self.name;
//3.返回新对象
return p;
}
//使用MUtablecopy时协议和方法名称换一下即可(zone是以前为了防止堆区内存碎片,现在不用管了)

两种方式:
copy和mutableCopy;
不论源对象是否为可变对象
源对象-copy-不可变副本对象
源对象-mutableCopy-可变副本对象;

而只有源对象和副本对象都不可变时,为浅复制,其余都是深复制

  • 浅复制:也称指针拷贝,此时实际没有产生新对象,源对象和副本对象为同一个,此时引用计数器+1,相当于一次retain操作
  • 深复制:值拷贝,创建了新对象,源对象计数器不变,副本对象引用计数器由于是新产生的对象为1.
对于@property的内存管理策略:

MAR下:

  • copy:只用于NSString和block和满足NSCopying协议的自定义类.
  • retain:除了上述之外所有对象
  • assign:基本数据类型,特例的当两个对象出现循环引用时一端用retain,一端用assign
  • —-

ARC下:

  • copy:相同 //copy NSString成不可变-为了不让外部意外改变值,//block是为了copy到堆区,不让提前释放.
  • strong:同retain ,如果对象释放,需要手动指向nil.(weak的话不需要,指针自动指向nil)
  • weak:当两个对象循环引用时一段strong,一端strong. (如delegate)
  • assign:相同

单例

作用:在开发中用于多个界面传值; 只创建一个对象,节省内存.
概念:单例模式的意图是类的对象成为系统中唯一的实例,提供一个访问点,共享;
使用场景:

  1. 类只能有一个实例,而且必须从一个为人熟知的访问点对其惊喜访问,比如:工厂方法;
  2. 这个唯一实例只能通过子类话进行扩展,而且扩展的对象不会破坏客户端代码.

特点:

  • 某个类只能有一个实例
  • 他必须自行创建这个对象
  • 必须自行向整个系统提供这个实例
  • 为了保证实例的唯一性,我们必须将….方法进行覆盖;

需要覆盖的方法:

-(id)copyWithZone:(NSZone*)zone{
return self;
}

+(id)allocWithZone:(NSZone*)zone{
//线程保护
@synchronized(self) {

    if (instances == nil) {
        //调用父类的alloc
        instances = [super allocWithZone:zone];           
        return instances;
    }        
}
 return instances;
}

-(id)retain{
return self;
}

-(NSUInteger)retainCount{
return NSUIntegerMax;
}

-(oneway void)release{
}

-(id)autorelease{
return self;
}

另外新定义一个类方法作为共享访问点:

先在.m中定义一个静态的对象类型的全局变量.并nil//静态区,程序结束释放.
static SingletonClass *instaces=nil;
+(instrancesType)shareXxxx{
  if(instaces==nil){
  instances=[self allocWithZone:null];
  return instances;
  }//判断对象是否存在,如果不存在创建新对象.
  return instances;
  //如果已经存在,什么都不做,直接返回对象

9. NSSet 和 NSArray

5.1 NSSet介绍:
1> 无序的、不重复的。存放到 NSSet 中的内容并不会排序与添加顺序也没有关系
2> 通过 anyObject 来访问单个元素
3> 遍历 NSSet 中的每个元素。通过forin循环来遍历
4> 好处: 效率高。
5> 应用场景:
- 比如重用 Cell 的时候, 从缓存池中随便获取一个就可以了, 无需按照指定顺序来获取
- 需要把数据存放到一个集合中, 然后判断集合中是否有某个对象的时候

5.2 NSArray介绍:
1> 有序的、可以有重复对象。对象的顺序是按照添加的顺序来保存的
2> 通过下标来访问
3> 好处: 有序访问
4> 应用场景: 在绝大多数需要依赖顺序的情况下(比如 tableView 的数据源集合,在实际操作中要根据下标来获取对象)

你可能感兴趣的:(对象)