oc学习之旅:内存管理,文件操作流程

来源:互联网 发布:千峰python视频教程 编辑:程序博客网 时间:2024/05/20 09:06

#import <Foundation/Foundation.h>

#import "Tail.h"

#import "Cat.h"

#define PATH @"XXXXXXXXXXXXXX"

int main(int argc,constchar * 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 afloat 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

         各顾各:谁(对象)申请谁释放

         */

    }

   return0;

}


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

{

    //_tailtail空间完全一致

    //_tail = tail;

   if (_tail != tail) {

        [_tailrelease];

       _tail = [tailretain];

    }

}

-(Tail *)tail

{

   return _tail;

}


Tail.m

-(void)dealloc

{

    NSLog(@"%@ dealloc",[selfclass]);

    [superdealloc];

}



0 0
原创粉丝点击