Objective_C_09

15/12/16
//  Objective_C_09

.m
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    
//    int i = 0;
//    while (YES) {
//        NSLog(@"%d",i);
//        i++;
//    }
    /*
     1.alloc影响一个对象从无到有的过程,使引用计数从0到1
     2.retain:只要对象接受retain消息,该对象的引用计数加1
     *该方法返回的还是本对象
     3.copy:将原来对象进行拷贝,原对象的引用计数不变,新的对象引用计数为1,这个方法的返回的是新的对象
     4.release:只给对象对应的内存空间引用计数减1
     */
    
//    Person *person = [[Person alloc] initWithName:@"小金刚" Age:45];
//    [person retain];
//    [person retain];
////    [person retain];
//    NSLog(@"person的引用计数是:%lu\n",[person retainCount]);
//    Person *person1 = [[Person alloc] initWithName:@"sdtgs" Age:420];
//    person1 = person;
//    NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
//    [person1 release];
//    NSLog(@"person的引用计数是:%lu",[person retainCount]);
//    NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
//    [person release];
//    NSLog(@"person的引用计数是:%lu",[person retainCount]);
//    NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
//    [person release];
//    NSLog(@"person的引用计数是:%lu",[person retainCount]);
//    NSLog(@"person1的引用计数是:%lu\n",[person1 retainCount]);
    
//    [person release];//过度释放,就会崩溃
//    person = nil;//指针置空
//    person1 = nil;
//    NSLog(@"%@",person.name);
//    NSLog(@"%@",person1.name);
//    retainCount只是调用显示,没有将指针置空的时候,虽然retainCount是0,但是显示的还是1
//    NSLog(@"person的引用计数是:%lu",[person retainCount]);
//    NSLog(@"person1的引用计数是:%lu",[person1 retainCount]);
    /*OC当中采用引用计数,当一个指针指向一块内存的时候,这块内存的引用计数就加1,当一个指针被去掉的时候,这块内存的引用计数就减1.(当引用计数为1还要对他进行release的时候),就回收这块内存,但是内存的内容不变,即引用计数依旧为1*/

//    copy 遵守NSopying协议并实现cipyWithZone的方法才能使用,此时原对象指向的内存空间引用计数不变,新对象引用计数为1
//    Person *per = [[Person alloc] init];//per 1
//    per.name= @"tutu";
//    per.age = 15;
//    NSLog(@"per的retainCount:%lu",[per retainCount]);
//    NSLog(@"%@",per.name);
//    Person *per1 = [per copy];
//    [per1 retain];
//    [per release];
////    per = nil;
////    per1 = nil;
////    [per1 retain];
//    NSLog(@"per1的retainCount: %lu",[per1 retainCount]);
////    NSLog(@"per的retainCount: %lu",[per retainCount]);
//    NSLog(@"%@",per1.name);
    
//    @autoreleasepool内部实例的对象不能在@autoreleasepool外部使用
//    @autoreleasepool {
//        
//        Person *pep = [[Person alloc] init];// 1
//        pep.name = @"zhaogao";
//        [pep retain];// 2
//        [pep release];
//        [pep autorelease];//
//        NSLog(@"+++++%lu",[pep retainCount]);
//        Person *p1 = [[Person alloc] init];
//        p1.name = @"lilianyin";
//        [p1 autorelease];
//        NSLog(@"****%lu",[p1 retainCount]);//autorelease出现在了两者之间,pool就会把接收 autorelease 的对象给保存起来(以栈的方式,把对象压入栈)
//        Person *pp2 = [[Person alloc] init];
//        pp2.name = @"shijie";
//        [pp2 autorelease];
//        NSLog(@"****%lu",[pp2 retainCount]);
//    }
//    @autoreleasepool {
//        Person *pee = [[Person alloc] init];
//        pee.name = @"实验 ";
//        [pee retain];
//        NSLog(@"ssss %lu",[pee retainCount]);
//        [pee release];
//        [pee autorelease];
//        NSLog(@"ssss %lu",[pee retainCount]);
//    }
//    @autoreleasepool {
//        for (int i = 0; i < 100000; i++) {
//            Person *psd = [[Person alloc] init];
//            psd.name = [NSString stringWithFormat:@"famgfamg"];
//            NSLog(@"%@",psd.name);
//            NSLog(@"%d",i);
//            [psd autorelease];
//        }
//    }

//  便利构造器:内部 alloc...autorelease,在没有出现释放池的时候,在不断的分配内存,直到内存不够用就崩溃掉, autorelease 不会立即释放,未来某一时刻释放
//    @autoreleasepool {
//        for (int i = 0; i < 100; i++) {
//            Person *psd = [[Person alloc] init];
//            psd.name = [NSString stringWithFormat:@"famgfamg"];
//            NSLog(@"%@",psd.name);
//            NSLog(@"%d",i);
//            [psd autorelease];
//        }
//        Person *p0 = [[Person alloc] init];
//        p0.name = @"dream";
//        [p0  autorelease];
//        [p0  release];
//        p0.name = @"hehe";
//        Person *pz = p0;
//        NSLog(@"%@",pz);
//        NSLog(@"%@",p0.name);
//        Person *sd = [Person personWithName:@"-lubu-" Age:45];
////        [sd retain];
//        [sd autorelease];
//        NSLog(@"%@  %lu",sd.name,[sd retainCount]);
//    }
//    Person *sd = [Person personWithName:@"-lubu-" Age:45];
////    [sd retain];
////    [sd release];
//    NSLog(@"%@  %lu",sd.name,[sd retainCount]);

    return 0;
}

Persom.h
#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying>

@property (nonatomic,retain)NSString *name;

@property (nonatomic,assign)NSInteger age;

- (instancetype)initWithName:(NSString *)name
                         Age:(NSInteger)age;
+ (instancetype)personWithName:(NSString *)name
                           Age:(NSInteger)age;
@end

Person.m
#import "Person.h"

@implementation Person

@synthesize name = _name,age = _age;

- (instancetype)initWithName:(NSString *)name
                         Age:(NSInteger)age{
    if ([super init]) {
        _name = name;
        _age = age;
    }
    return self;
}

+ (instancetype)personWithName:(NSString *)name
                         Age:(NSInteger)age{
    Person *p = [[Person alloc] initWithName:name Age:age];
    return p;
}

- (void)dealloc{
    NSLog(@"%@被销毁了",self.name);
    [super dealloc];
}

- (instancetype)copyWithZone:(NSZone *)zone{
    Person *p = [[Person allocWithZone:zone] init];
    p.name = _name;
    p.age = _age;
    return p;
}

@end

posted @ 2015-12-19 17:45  DH_Fantasy  阅读(79)  评论(0)    收藏  举报