• OC之Copy语法


    转载请注明:http://www.cnblogs.com/letougaozao/p/3631105.html

    • 概念
    • 内存管理
    • NSString的copy实例
    • 对象的copy实例

    一、概念

    目的:在改变原有对象的时候,不会改变新对象的值

    1. Copy:实现NSCopying协议,创建的是一个不可变副本
    2. MutableCopy:实现NSMutableCopying协议,创建的是一个可变副本

    二、内存管理

    1. 深拷贝:产生新的对象,所以源对象计数器不变>>>对象拷贝
    2. 浅拷贝:不产生新对象,所以源对象计数器加一>>>指针拷贝(因为对象本身不可以变,所有没有必要再创建一个对象)

    三、NSString的copy实例

    //
    //  main.m
    //  Copy语法
    //
    //  Created by apple on 14-3-28.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    void test1()
    {
        NSString *str = [NSString stringWithFormat:@"age is %i", 10];
        NSString *str1 = [str copy];
        
        NSLog(@"%i", str == str1);
        
        NSString *str2 = [str mutableCopy];
        
        NSLog(@"%i", str2 == str);
    }
    
    void test2()
    {
        NSMutableString *str = [NSMutableString stringWithFormat:@"age is %i", 11];
        
        NSString *str1 = [str copy];
        NSMutableString *str2 = [str mutableCopy];
        
        [str appendFormat:@"1"];
        
        NSLog(@"%i", str == str2);
        NSLog(@"%i", str == str1);
        NSLog(@"%@", str);
        NSLog(@"%@", str1);
    }
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            test2();
            
        }
        return 0;
    }

    四、对象拷贝的实例

    对象的拷贝,主要注意点

    1.  必须实现NSCopying协议
    2. 需要重写- (id)copyWithZone:(NSZone *)zone方法
    3. 代码中 self class的引用

    1⃣️GoodStudent.h

    //
    //  GoodStudent.h
    //  Student的Copy用法
    //
    //  Created by apple on 14-3-28.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "Student.h"
    
    @interface GoodStudent : Student
    
    @property (nonatomic, assign) int age;
    
    +(id)goodStudentWithName:(NSString *)name withAge:(int)age;
    
    @end

    2⃣️GoodStudent.m

    //
    //  GoodStudent.m
    //  Student的Copy用法
    //
    //  Created by apple on 14-3-28.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "GoodStudent.h"
    
    @implementation GoodStudent
    
    +(id)goodStudentWithName:(NSString *)name withAge:(int)age
    {
        GoodStudent *stu = [super studentWithName:name];
        stu.age = age;
        
        return stu;
    }
    
    -(id)copyWithZone:(NSZone *)zone
    {
        GoodStudent *copy = [super copyWithZone:zone];
        copy.age = self.age;
        
        return copy;
    }
    
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"%@-%i", self.name, self.age];
    }
    
    @end

    3⃣️Student.h

    //
    //  Student.h
    //  Student的Copy用法
    //
    //  Created by apple on 14-3-28.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject <NSCopying>
    
    @property (nonatomic, copy) NSString *name;
    
    +(id)studentWithName:(NSString*)name;
    
    @end

    4⃣️Student.m

    //
    //  Student.m
    //  Student的Copy用法
    //
    //  Created by apple on 14-3-28.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import "Student.h"
    
    @implementation Student
    +(id)studentWithName:(NSString *)name
    {
        Student *stu = [[[[self class] alloc] init] autorelease];
        stu.name = name;
        
        return stu;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        Student *copy = [[self class] allocWithZone:zone];
        
        copy.name = self.name;
        
        return copy;
    }
    
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"%@", self.name];
    }
    
    -(void)dealloc
    {
        [_name release];
        [super dealloc];
    }
    @end

    main.m

    //
    //  main.m
    //  Student的Copy用法
    //
    //  Created by apple on 14-3-28.
    //  Copyright (c) 2014年 apple. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import "GoodStudent.h"
    
    void test1()
    {
        Student *stu = [Student studentWithName:@"name1"];
        Student *stu1 = [stu copy];
        
        NSLog(@"%@", stu);
        NSLog(@"%@", stu1);
    }
    
    void test2()
    {
        GoodStudent *stu1 = [GoodStudent goodStudentWithName:@"name1" withAge:10];
        
        GoodStudent *stu2 = [stu1 copy];
        
        NSLog(@"%@", stu1);
        NSLog(@"%@", stu2);
        
    }
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            test2();
            
        }
        return 0;
    }
  • 相关阅读:
    App调试的几个命令实践【转】
    解决sdk更新时候报错 http://dl-ssl.google.com/android上不去,链接拒绝
    fastjson序列化排序问题
    Java中的四种引用
    equal&==&hashcode
    ThreadPool线程池的关注点
    JVM的本地方法栈
    JVM的堆分配
    JVM的类装载子系统
    JVM的数据类型
  • 原文地址:https://www.cnblogs.com/letougaozao/p/3631105.html
Copyright © 2020-2023  润新知