NSCopy 및 NSMutableCopy 기술 포인트

7779 단어 copy
메모리 관리 NSString의 copy 실례 대상의 copy 실례 1, 개념적 목적: 원래의 대상을 바꿀 때 새로운 대상의 값을 바꾸지 않음 Copy: NSCopying 프로토콜을 실현하고 변하지 않는 던전 Mutable Copy: NSMutable Copying 프로토콜을 실현하고 가변 던전 2, 내심 복사: 새로운 대상을 생성,소스 객체 카운터는 변경되지 않음>>> 객체 복제의 얕은 복사: 새 객체가 생성되지 않으므로 소스 객체 카운터에 1>>> 포인터 복사 3, NSString의copy 실례를 추가합니다.
#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;
}

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 <Foundation/Foundation.h>
@interface Student : NSObject <NSCopying>
@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 <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;
}

좋은 웹페이지 즐겨찾기