内存入门

来源:互联网 发布:淘宝收货可以延长多久 编辑:程序博客网 时间:2024/05/16 03:26

#pragma mark 手动管理内存

//影响引用计数改变的方法:

        //alloc   retain   release   autorelease   dealloc    copy    mutableCopy


#pragma mark   引用计数增加


 //alloc 将引用计数从零变为一;


//retainCount 看引用计数


 //将对应的内存引用加一,并返回内存首地址;

        Person *per1 = [per retain];

//释放

        [per1 release];


//当引用计数为1时,再次releas 不会将引用计数减为0

        //而是将内存释放


 [per2 retain];   //持有对象;


 //自动释放池

        @autoreleasepool {

            //自动释放    当自动释放池释放时,释放对象;

            //只有在自动释放池里面使用autorelease才有效;

            [per2 autorelease];

            [per2 autorelease];

                 NSLog(@"%ld",per2.retainCount);

        }  //自动释放池释放


//不能对常量区的内存进行管理

NSString   以及常量

 //不可变字符串引用计数都是-1,及是整数的最大值;


 //内存管理原  

         一、谁创建,谁释放;  alloc  release/autorelease

         二、是持有,谁释放;  retain  release/autorelease

         四、谁拷贝,谁释放;  copy   release/autorelease

         三、没有retain,alloc,copy就不释放;


//当对象被销毁时,系统自动调用这个方法

-(void)dealloc {

    //释放属性的空间,本类  

    NSLog(@“快释放我");    

    //先释放本类在释放父类;

    [super dealloc];  //释放父类;

    [_name release];

}

 Person *per2 = [per copy];

@interface Person : NSObject <NSCopying>

////浅拷贝

//-(id)copyWithZone:(NSZone *)zone {

//    Person *p = [[Person alloc] init];

//    p.name = self.name;

//    return p;

//}


////伪拷贝

//-(id)copyWithZone:(NSZone *)zone {

//    return [self retain];

//}


//深拷贝  对象开辟新的空间,两个对象的实例变量也指向不同的空间。

-(id)copyWithZone:(NSZone *)zone {

    Person *p = [[Person alloc] init];

//      p.name = [[NSString alloc] initWithString:self.name];

    p.name = [[NSString alloc] initWithFormat:@"%@",self.name];

    return p;

}



#pragma 协议

//以@protocol 开始,以@end结束

/*

 @protocol 协议名称 <父协议>

 

 

    协议方法(标志)

 

 

 @end

 */


//协议只需要方法的声明,不需要实现;

在.M文件里写实现;


协议与类的融合

//协议格式:   <协议名称>

// 遵守协议之后,

//多个协议 用逗号隔开;

@interface Person : NSObject <iOsProgramer, RedPacket>


选择实现;

@optional


默认是必须实现的方法;

@required

0 0