`
gkuiyj
  • 浏览: 90964 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Objective-C个人学习系列(7) 内存管理与深 浅复制

 
阅读更多

#import <Foundation/Foundation.h>

#import "Person.h"

 

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        

        //内存管理规则:只要有allocretainnewcopymutablecopy的地方,都要有对应的release

        //[Object new] => [[Object alloc] init]

        NSString * string = [[NSString alloc]initWithFormat: @"123"];

        

        NSLog(@"string retainCount=%ld",[string retainCount]);

        

        [string retain];

        

        NSLog(@"string retainCount=%ld",[string retainCount]);

        

        [string release];

        

        NSLog(@"string retainCount=%ld",[string retainCount]);

        

        NSString * string2 = [string copy];     

         //NSString: copy => [string retain] NSStringcopy 只是将计数器+1

        

        NSLog(@"string2 retainCount=%ld",[string2 retainCount]);

        NSLog(@"string retainCount=%ld",[string retainCount]);

        

        [string2 release];

        

        [string release];

        

        NSLog(@"string retainCount=%ld",[string retainCount]);

        

       

        

        //***********************copy mutableCopy****************************

        //copy : 不可变复制,需要实现协议<NSCopying>

        NSString * _str = [[NSString alloc] initWithFormat:@"AAA"];

        Person * person = [[Person alloc] initWithName:_str sex:18];

        //

        Person *person2 = [person copy];

        

        NSLog(@"person->_name=%@",person->_name);           //person->_name=AAA

        NSLog(@"person2->_name=%@",person2->_name);         //person2->_name=AAA

        

        [person setName:@"BBB"];

        

        NSLog(@"不可变复制:");

        NSLog(@"person->_name=%@",person->_name);           //person->_name=BBB

        NSLog(@"person2->_name=%@",person2->_name);         //person2->_name=AAA

        

        //mutalbeCopy:可变复制,需要实现<NSMutalbeCopying>

        Person *person3 = [person mutableCopy];

        [person setName:@"CCC"];

        

        NSLog(@"可变复制:");

        NSLog(@"person->_name=%@",person->_name);           //person->_name=CCC

        NSLog(@"person3->_name=%@",person3->_name);         //person2->_name=BBB

        

        

        [_str release];

        [person release];

        [person2 release];

        [person3 release];

        

        

        //浅复制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。

        //深复制:在复制操作时,对于被复制的对象至少有一层复制是对象复制。

        

        //*************************可变&不可变字符串的不可变复制与可变复制*******************

        //1、不可变字符串

        NSString * str = [[NSString alloc] initWithFormat:@"abc"];

        

        //1)不可变字符串的不可变复制(地址不变,只是引用计数+1)

        NSLog(@"不可变字符串的不可变复制");

        NSString *str2 = [str copy];

        NSLog(@"NSString &str = %p",str);         //str = 0x100105b00

        NSLog(@"NSString &str2 = %p",str2);       //str2 = 0x100105b00

        

        //2)不可变字符串的可变复制(地址改变,逻辑上可认为深度复制)

        NSLog(@"不可变字符串的可变复制");

        NSMutableString *str3 = [str mutableCopy];

        

        NSLog(@"NSMutableString &str = %p",str);         //str = 0x100105b00

        NSLog(@"NSMutableString &str3 = %p",str3);       //str3 = 0x100108a50

        

        NSLog(@"str = %@",str);         //str = abc

        NSLog(@"str3 = %@",str3);       //str3 = abc

        

        [str3 appendString:@"123"];

        

        NSLog(@"str = %@",str);         //str = abc

        NSLog(@"str3 = %@",str3);       //str3 = abc123

        

        //2、可变字符串

        NSMutableString *mStr = [[NSMutableStringalloc]initWithFormat:@"abcde"];

        

        //1)可变字符串的不可变复制(地址改变,复制字符串对象,并且复制字符串内容,深度copy)

        NSLog(@"可变字符串的不可变复制");

        NSMutableString *mStr2 = [mStr copy];

        

        NSLog(@"NSMutableString &mStr = %p",mStr);         // &mStr = 0x100206f80

        NSLog(@"NSMutableString &mStr2 = %p",mStr2);       //&mStr2 = 0x100205fd0

        

        NSLog(@"mStr = %@",mStr);                   //mStr = abcde

        NSLog(@"mStr2 = %@",mStr2);                 //mStr2 = abcde

        

        [mStr appendString:@"qqq"];

        

        NSLog(@"mStr = %@",mStr);                   //mStr = abcdeqqq

        NSLog(@"mStr2 = %@",mStr2);                 //mStr2 = abcde

        

        //2)可变字符串的可变复制(地址改变,复制字符串对象,同时复制字符串内容,深度copy

        NSLog(@"可变字符串的可变复制");

        NSMutableString *mStr3 = [mStr mutableCopy];

        

        NSLog(@"NSMutableString &mStr = %p",mStr);         // &mStr = 0x100206b40

        NSLog(@"NSMutableString &mStr3 = %p",mStr3);       // &mStr3 = 0x100206de0

        

        NSLog(@"mStr = %@",mStr);           //mStr = abcde

        NSLog(@"mStr3 = %@",mStr3);         //mStr3 = abcde

        

        [mStr appendString:@"888"];

        

        NSLog(@"mStr = %@",mStr);           //mStr = abcde888

        NSLog(@"mStr3 = %@",mStr3);         //mStr3 = abcde

        

        [str release];

        [str2 release];

        [str3 release];

        

        [mStr release];

        [mStr2 release];

        [mStr3 release];

        

         

        

        //**********************可变&不可变字符串数组的不可变复制与可变复制************************

        NSMutableString* s1 = [[NSMutableStringalloc]initWithFormat:@"A"];

        NSMutableString* s2 = [[NSMutableStringalloc]initWithFormat:@"B"];

        NSMutableString* s3 = [[NSMutableStringalloc]initWithFormat:@"C"];

        //1、不可变字符串数组

        NSArray *array = [[NSArray alloc]initWithObjects:s1,s2,s3, nil];

        

        //1)不可变字符数组的不可变复制(地址不变,只是引用计数+1,同NSString

        NSLog(@"不可变字符串数组的不可变复制");

        NSArray *array2 = [array copy];

 

        NSLog(@"&array = %p",array);             //array = 0x100203da0

        NSLog(@"&array2 = %p",array2);           //array2 = 0x100203da0

        

        //2)可变复制(地址改变,复制字符串数组对象,但字符数组中字符串内容不改变,深度copy

        NSLog(@"不可变字符串数组的可变复制");

        NSArray *array3 = [array mutableCopy];

        

        NSLog(@"&array = %p",array);             //array = 0x100203da0

        NSLog(@"&array3 = %p",array3);           //array3 = 0x100203b20

        

        NSLog(@"array[0]->%@",array[0]);        //mArray->A

        NSLog(@"array3[0]->%@",array3[0]);      //mArray3->A

        //改变数组中字符串的值

        [array[0] appendString:@"123"];

 

        NSLog(@"array[0]->%@",array[0]);        //array[0]->A123

        NSLog(@"array3[0]->%@",array3[0]);      //array3[0]->A123

         

        //2、可变字符串数组

        NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:s1,s2,s3, nil];

        

        //1)可变字符串数组的不可变复制(地址改变,复制字符对象,数组中字符对象内容不变,深度copy

        NSLog(@"可变字符串数组的不可变复制");

        NSMutableArray *mArray2 = [mArray copy];

        NSLog(@"&mArray = %p",mArray);           //mArray = 0x100100310

        NSLog(@"&mArray2 = %p",mArray2);         //mArray2 = 0x10010c200

        NSLog(@"mArray->%@",mArray[0]);         //mArray->A

        NSLog(@"mArray2->%@",mArray2[0]);       //mArray2->A

        

        //改变数组中字符串的值

        [mArray[0] appendString:@"333"];

        

        NSLog(@"mArray->%@",mArray[0]);         //mArray->A333

        NSLog(@"mArray2->%@",mArray2[0]);       //mArray2->A333

        

        //2)可变字符串数组的可变复制(地址改变,复制数组对象,但数组中字符对象内容不变,深度copy

        NSLog(@"可变字符串数组的可变复制");

        NSMutableArray *mArray3 = [mArray copy];

        NSLog(@"&mArray = %p",mArray);           //mArray = 0x100208440

        NSLog(@"&mArray3 = %p",mArray3);         //mArray3 = 0x100208f30

        NSLog(@"mArray->%@",mArray[0]);         //mArray->A333

        NSLog(@"mArray3->%@",mArray3[0]);       //mArray3->A333

        

        //改变数组中字符串的值

        [mArray[0] appendString:@"444"];

        

        NSLog(@"mArray->%@",mArray[0]);         //mArray->A333444

        NSLog(@"mArray3->%@",mArray3[0]);       //mArray2->A333444

        

        [s1 release];

        [s2 release];

        [s3 release];

        [array release];

        [array2 release];

        [array3 release];

        [mArray release];

        [mArray2 release];

        [mArray3 release];

    }

    return 0;

}

 

 

 

#import "Person.h"

 

@implementation Person

 

-(id)initWithName:(NSString *)name sex:(unsigned char)sex{

 

    self = [super init];

    if (self != nil ) {

        if (name==NULL) {

            return NULL;

        }

        _name = [name retain];

        _sex = sex;

    }

    returnself;

}

 

-(void)setName:(NSString *)name{

    [name retain];

    [_name release];

    _name = name;

}

 

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

    Person *person = [[Person allocWithZone:zone] initWithName:_name sex:_sex];

    return person;

}

 

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

    Person *person = [[Person allocWithZone:zone] initWithName:_name sex:_sex];

    return person;

}

 

-(void)dealloc{

    [_name release];

    _name = nil;

    [super dealloc];

}

 

 

@end

 

#import <Foundation/Foundation.h>

 

@interface Person : NSObject<NSCopying,NSMutableCopying>{

@public

    NSString* _name;

    unsignedchar _sex;

}

 

-(id)initWithName:(NSString*)name sex:(unsigned char)sex;

-(void)setName:(NSString*)name;

 

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

- (id)mutableCopyWithZone:(NSZone *)zone;

 

@end

 

#import "Person.h"

 

@implementation Person

 

-(id)initWithName:(NSString *)name sex:(unsigned char)sex{

 

    self = [super init];

    if (self != nil ) {

        if (name==NULL) {

            return NULL;

        }

        _name = [name retain];

        _sex = sex;

    }

    returnself;

}

 

-(void)setName:(NSString *)name{

    [name retain];

    [_name release];

    _name = name;

}

 

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

    Person *person = [[Person allocWithZone:zone] initWithName:_name sex:_sex];

    return person;

}

 

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

    Person *person = [[Person allocWithZone:zone] initWithName:_name sex:_sex];

    return person;

}

 

-(void)dealloc{

    [_name release];

    _name = nil;

    [super dealloc];

}

 

 

@end

分享到:
评论

相关推荐

    objective-c学习资料

    在Objective-C中,内存管理主要依赖于ARC(Automatic Reference Counting),它自动处理对象的引用计数。了解如何正确使用`strong`、`weak`、`assign`等属性关键字至关重要,以防止内存泄漏和循环引用。 8. **...

    Objective-C培训教程

    浅复制和深复制是复制对象的两种方式,分别复制对象的引用和对象的全部内容。 第十二章归档,介绍了如何在Objective-C中持久化对象。对象可以通过归档保存到文件中,或者从文件中加载。这个过程通常涉及到使用...

    Objective-C2.0程序设计

    第二部分详细阐述了Foundation框架,介绍了数字、字符串、集合、文件操作、内存管理、对象复制和归档等重要内容。Foundation框架是Objective-C语言中非常重要的一个组件,它提供了一组丰富的、面向对象的类,为开发...

    Objective-C Fundamentals

    除此之外,Objective-C还拥有指针类型,这对于管理内存和实现指针操作十分重要。变量作为存储数据的容器,在程序中起到关键作用。通过声明变量,开发者可以定义存储不同类型数据的变量,并通过赋值来更改这些变量的...

    Objective-C 2.0编程语言(Apple Inc.)The Objective-C 2.0 Programming Language (Apple Inc.)

    文档提供了一系列关于编程语言的细节,包括语法、类、对象、内存管理以及它在应用程序开发中的使用。从文档描述来看,本书涵盖了Objective-C语言的核心概念和高级功能,强调了如何在苹果平台上有效运用该语言进行...

    Objective-C示例代码1

    8. **内存管理**:Objective-C使用引用计数(ARC)来管理内存,`retain`、`release`和`autorelease`等关键字可能在`FractionDemo`的实现中出现。 9. **KVC(Key-Value Coding)和KVO(Key-Value Observing)**:...

    0基础iOS开发学习计划Objective-c语言内容概述.doc

    ### 0基础iOS开发学习计划Objective-c语言内容概述 #### Objective-C简介 Objective-C是一种结合了C语言特性和面向对象编程思想的语言,它是苹果iOS和macOS应用开发的基础语言之一。Objective-C诞生于20世纪80年代...

    Learn Objective-C On The Mac(英文PDF+SourceCode)

    "Learn Objective-C On The Mac"教程是专为在Mac平台上学习Objective-C而设计的,它涵盖了语言的基本概念以及如何在Xcode集成开发环境中应用这些知识。 该教程的英文PDF部分可能包括以下章节和主题: 1. **...

    《Objective-C2.0程序设计(原书第2版)》_中文完整版

    Foundation框架为Objective-C提供了大量的内置类库,涵盖了字符串(Strings)、数字(Numbers)、集合(Collections)、文件操作(File Operations)、内存管理(Memory Management)、对象复制(Object Copying)和...

    《Objective-C 2.0程序设计(原书第2版)》[PDF]

    第二部分详细阐述了foundation框架,涵盖数字、字符串、集合、文件操作、内存管理、对象复制和归档等重要内容;第三部分简要介绍了cocoa和iphone sdk;第四部分是附录,主要列出了objective-c的快速参考。. 本书结构...

    Objective-C 2.0程序设计

    ### Objective-C 2.0程序设计相关知识点 #### 一、Objective-C语言基础 - **类与对象**:Objective-C是一种面向对象的语言,其核心概念是类和对象。类定义了对象的行为和属性,对象则是类的一个实例。本书第一章至...

    Objective-C_2.0程序设计

    4. **对象复制与归档**:支持对象的深复制和浅复制,以及将对象序列化为持久存储格式的功能。 #### 四、Cocoa和iPhone SDK 1. **Cocoa**:Cocoa是Mac OS X的应用程序框架,包含了一系列API,用于构建桌面应用程序...

    Objective-C培训资料.pdf

    开发者可以创建对象的深拷贝或浅拷贝,以满足不同场景下的内存管理需求。 归档 归档是Objective-C中用来将对象持久化存储的过程。归档后的对象可以被写入到文件系统中,也可以从文件中恢复。归档通常使用...

    (学习Objective-C最新最好的稀缺图书,配示例代码)Learn Objective-C On The Mac, 2009

    这本书"Learn Objective-C On The Mac, 2009"为学习者提供了深入理解Objective-C的基础,并且附带了示例代码,这对于实践编程和加深理解至关重要。 Objective-C的起源与特点: Objective-C是在C语言的基础上扩展而...

    Objective-C培训资料

    由于其与C语言的兼容性,Objective-C在开发苹果操作系统(如macOS和iOS)的应用程序时非常流行。 #### 二、程序整体语法结构 Objective-C程序通常由头文件(.h)和源文件(.m)组成。头文件包含了类的声明,而...

    Effective Objective-C 2.0 中文版.zip

    7. **自动引用计数(ARC,Automatic Reference Counting)**:Objective-C的内存管理机制,它自动管理对象的生命周期,减少程序员手动管理内存的工作。 8. **Category中的实例变量(Instance Variables in ...

    The Objective-C Programming Language

    虽然文档没有直接展示Objective-C的详细语言特性,但作为一本官方指南,它很可能是以详细的教程形式介绍了Objective-C的核心特性,包括类和对象、继承、多态、消息传递、内存管理、集合类型、协议、块(block)等...

    Programming in Objective-C Edition 6

    在本书中,Kochan详细阐述了Objective-C的基础知识,包括语言语法、面向对象编程的核心概念、类、继承、消息传递、内存管理等。通过本书的学习,读者可以掌握Objective-C的基本知识,并能够将这些知识应用到实际的...

Global site tag (gtag.js) - Google Analytics