zoukankan      html  css  js  c++  java
  • iOS中的内存管理1

    #import <Foundation/Foundation.h>
    #import "Person.h"
    int main(int argc, const char * argv[]) {
    //    @autoreleasepool {
    //        
    //        Person *p = [[Person alloc] initWithName:@"池" gender:@"nan" age:18];
    //        NSLog(@"%lu",[p retainCount]);
    //        
    //        
    //        NSLog(@"--------------");
    //        Person *p1 = [p retain];
    //        NSLog(@"%lu",[p retainCount]);
    //        NSLog(@"%lu",[p1 retainCount]);
    //        
    //        NSLog(@"--------------");
    //        
    //        Person *p2 = [p1 retain];
    //        NSLog(@"%lu",[p retainCount]);
    //        NSLog(@"%lu",[p1 retainCount]);
    //        NSLog(@"%lu",[p2 retainCount]);
    //        
    //        NSLog(@"--------------");
    //        //release 让对象的引用计数立即 -1
    //        [p release];
    //        NSLog(@"%lu", [p retainCount]);
    //        [p release];
    //        NSLog(@"%lu", [p retainCount]);
    //        [p release];
    //        NSLog(@"%lu", [p retainCount]);// 错误的
    //        //谁才有引用计数的概念:
    //        //1.堆区空间才有引用计数的概念
    //        //2.堆区的对象才会有引用计数
    //    
    //    }
    //    Person *p = [[Person alloc] initWithName:@"张三" gender:@"男" age:18];
    //    NSLog(@"%lu", [p retainCount]);
    //    [p retain];
    //    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    //    
    //    
    //    
    //    [p autorelease];
    //    
    //    NSLog(@"%lu",[p retainCount]);
    //    
    //    
    //    
    //    [pool release];
    //     NSLog(@"%lu",[p retainCount]);
    //    
        
        
        //企业级题
    //    @autoreleasepool {
    //        for (long i = 0; i < 100000000; i++) {
    //            @autoreleasepool {
    //                Person *per = [[Person alloc] init];
    //                [per autorelease];
    //            }
    //        }
    //    }
        
        //内存管理原则:当你对一个对象进行了 alloc, retain, copy 操作,你就对该对象拥有了所有权,要对该对象负责,对其进行release,或者autorelease操作
        //在一个方法内部,要保证对象的+ 和 - 相等.
        
        
        //创建Person对象
        @autoreleasepool {
            Person *p = [Person personWithName:@"张三" gender:@"" age:44];
            Person *p1 = [p copy];
            
            [p1 sayHi];
            [p1 release];
        }
       
        
        //内存问题:
        //1.野指针错误:最后一个release玩,空间已经被系统回收,如果再访问,就是访问一块没有所有权的空间,出现野指针,野指针不会立即报错,但是存在安全隐患,另外,错误不容易排错.
        //2.过度释放:对一块没有所有权的空间进行释放空间,会造成程序的立即crash;
        //3.内存泄露:对一块拥有所有权的空间,使用完之后没有释放,此时存在安全隐患,当内存泄露足够多得时候,造成程序的crash;
        return 0;
    }

    person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject<NSCopying>
    @property (nonatomic,retain) NSString *name;
    @property (nonatomic,retain) NSString *gender;
    @property (nonatomic,assign) NSInteger age;
    
    - (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
    + (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
    - (void)sayHi;
    @end

    person.m

    #import "Person.h"
    
    @implementation Person
    - (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age
    {
        if (self = [super init]) {
            self.name = name;
            self.gender = gender;
            self.age = age;
        }
        return self;
    }
    
    + (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
        return [[[self alloc] initWithName:name gender:gender age:age] autorelease];
        
    }
    - (void)sayHi
    {
        NSLog(@"sayHigoggo");
    }
    //当对一个兑现copy时,会自动调用该方法,用来创建新的对象,复制内容
    - (id)copyWithZone:(NSZone *)zone
    {
        //1.创建新的对象
        Person *newPer = [[Person allocWithZone:zone] init];
        //2.拷贝内容
        newPer.name = self.name;
        newPer.age = self.age;
        newPer.gender = self.gender;
        //3.返回新的对象
        return newPer;
    }
    //当对象的引用计数为0是系统会自动调用,切记不要人为调用
    - (void)dealloc
    {
        NSLog(@"%@回收了",self);
        [super dealloc];
    }
    @end
  • 相关阅读:
    申请奖励加分
    寒假学习01
    加分项及建议
    12月30日总结
    12月17日 期末总结
    12月31日总结
    12月15日总结
    12月28日总结
    01月03日总结
    01月05日总结
  • 原文地址:https://www.cnblogs.com/wohaoxue/p/4725506.html
Copyright © 2011-2022 走看看