代码改变世界

属性内存管理

2015-12-14 10:46  AB小博客  阅读(150)  评论(0)    收藏  举报

 1.assign 赋值不会引起计数的变化,弱引用,ARC中对象不能使用,但原始类型BOOL int float仍然可以使用

 2.copy 拷贝,复制一个对象并创建strong关联,引用计数为1(+1),原来的引用计数不变

 3.retain 持有,对原对象引用计数加1,强引用,ARC中使用strong

 4.weak 赋值(ARC),比assign多了一个功能,对象释放后把指针设置为nil,避免野指针

 5.strong 持有(ARC),等同于retain。

//
//  main.m

#import <Foundation/Foundation.h>
#import "Pet.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [[Person alloc]init];
        Pet *pet = [[Pet alloc]init];
       
        [p setName:@"qq"];
        [p setPet:pet];
        [p setAge:32];
        [p test];
        [p release];
        
        [pet release];
        [pet release];
        
    }
    return 0;
}

 

//
//  Person.h
#import <Foundation/Foundation.h>
#import "Pet.h"
@interface Person : NSObject
{
//    @private
//    Pet *_pet;
//    NSString *_name;
//    int _age;
  
}
@property(nonatomic,retain)Pet *pet; 等同于下边两行
//-(void)setPet:(Pet*)myPet;
//-(Pet*)pet;
@property (nonatomic,copy)NSString *name;
//-(void)setName:(NSString*)name;
//-(NSString*)name;
@property(nonatomic,assign)int age;
//-(void)setAge:(int)age;
//-(int)age;

-(void)test;
@end
//
//  Person.m

#import "Person.h"

@implementation Person
//-(void)setPet:(Pet*)myPet{
//    if (_pet!=myPet) {
//        [_pet release];
//        _pet=[myPet retain];
//    }
//    
//}
//-(Pet*)pet{
//    return _pet;
//}
//
//-(void)setName:(NSString*)name{
//    if (_name!=name) {
//        [_name release];
//        _name=[name retain];
//    }
//}
//-(NSString*)name{
//    return _name;
//}
//
//-(void)setAge:(int)age{
//    _age =age;
//}
//-(int)age{
//    return _age;
//}

-(void)test{
    NSLog(@"%@,%@,%d",_name,[_pet getName],_age);
}
@end