OC의 Copy 구문

3239 단어
  • 개념
  • 메모리 관리
  • NSString의 copy 인스턴스
  • 대상의copy실례1, 개념목적: 원래의 대상을 바꿀 때 새로운 대상의 값을 바꾸지 않는다Copy: NSCopying 프로토콜을 실현하고 변하지 않는 복사본인 Mutable Copy를 창설한다. NSMutable Copying 프로토콜을 실현하고 가변 복사본 2, 내심 복사본을 창설한다. 새로운 대상이 생기기 때문에 원본 대상 계수기는 변하지 않는다>>> 대상 복사는 얕은 복사: 새로운 대상이 생기지 않는다.소스 객체 카운터에 1>> 포인터 복사 3, NSString의 copy 인스턴스
  • 추가
    #import 
    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;
    }
    

    4. 대상 복사의 실례
    객체의 복제본, 주요 고려 사항
    1. NSCopying 프로토콜이 있어야 합니다. 2.다시 쓰기 필요 - (id) copyWithZone: (NSZone *) zone 메서드
    GoodStudent.h
    #import "Student.h"
    @interface GoodStudent : Student
    @property (nonatomic, assign) int age;
    +(id)goodStudentWithName:(NSString *)name withAge:(int)age;
    @end
    

    GoodStudent.m
    #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
    

    Student.h
    #import 
    @interface Student : NSObject 
    @property (nonatomic, copy) NSString *name;
    +(id)studentWithName:(NSString*)name;
    @end
    

    Student.m
    #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
    #import 
    #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;
    }
    

    좋은 웹페이지 즐겨찾기