#import <Foundation/Foundation.h>
#import "Tail.h"
#import "Cat.h"
#define PATH @"XXXXXXXXXXXXXX"
int main(int argc,const char * argv[])
{
@autoreleasepool {
/*
NSFileManager
判断文件下是否存在
[manager fileExistsAtPath:PATH isDirectory:<#(BOOL *)#>]
if(文件夹不存在)
1.创建文件夹
{
[manager createDirectoryAtPath:<#(NSString *)#> withIntermediateDirectories:<#(BOOL)#> attributes:<#(NSDictionary *)#> error:<#(NSError *__autoreleasing *)#>];
}
创建文件部分:
[manager fileExistsAtPath:PATH]
if(文件不存在)
2.创建文件
{
[manager createFileAtPath:<#(NSString *)#> contents:<#(NSData *)#> attributes:<#(NSDictionary *)#>];
}
创建成功
--------------
NSFileHandle 获得一个可读可写的文件句柄对象 NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:PATH];
读写文件 操作nsdata对象
写:wirteData
读:readDataOfLength
读写过程中需要关注文件流指针:决定读取写到哪个位置
操作流指针:seekToFileOffset:
*/
/*
内存划分:
堆:手动开辟出来的内存空间(alloc malloc new等)不会被系统回收
只能手动回收(free release delete ...)
栈:局部变量(int a,float f...)变量的生命周期决定是否被回收
静态数据区:static int a;以static修饰的变量会存储在静态数据区
程序退出时由系统自动回收
内存管理:回收多余的内存空间
oc中:一个对象在内存中就是一段内存空间
NSMtuableString * str = [[NSMtuableString alloc] init]
如果不[str release] 那么str就会一直占用堆空间
对象的引用计数是oc特有的内存管理方法
ios会一直监控程序中的所有对象当某一个对象的引用计数值为0时对象的空间会被回收(自动调用对象的dealloc方法)
我们只需维持引用技术平衡:只要有对象在使用这段空间那么他的引用计数就不能为0
*/
Tail *t = [[Tailalloc] init];
Cat *c = [[Catalloc] init];
NSLog(@"%ld",t.retainCount);
[csetTail:t];
NSLog(@"%ld",t.retainCount);
[trelease];
t =nil;
NSLog(@"%ld",t.retainCount);
//t已经被释放,如果继续使用t对象那么就是使用野指针
[crelease];
/*
只要对象出现alloc copy mutable new retain这些关键字时就应使用对象的release autorelease方法
一对一:一个alloc对应一个release或者autorelease
各顾各:谁(对象)申请谁释放
*/
}
return 0;
}
Cat.h
#import "Tail.h"
@interface Cat : NSObject
{
Tail *_tail;
}
-(void) setTail:(Tail *)tail;
-(Tail *)tail;
Cat.m
- (void)dealloc
{
self.tail =nil;
[superdealloc];
}
- (void) setTail:(Tail *)tail
{
//_tail与tail空间完全一致
//_tail = tail;
if (_tail != tail) {
[_tailrelease];
_tail = [tail retain];
}
}
-(Tail *)tail
{
return _tail;
}
Tail.m
-(void)dealloc
{
NSLog(@"%@ dealloc",[selfclass]);
[superdealloc];
}