OC- 属性 深复制、浅复制

属性

main.m

#import <Foundation/Foundation.h>
#import "Human.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Human *human = [[Human alloc] init];
        human.name = @"tom";
        NSLog(@"%@",human.name);

        human.age = -10;
        NSInteger age1 = human.age;
        NSLog(@"sum = %ld",age1);
    }
    return 0;
}

Human.h

#import <Foundation/Foundation.h>

@interface Human : NSObject
//{
//    NSString *_name;
//    NSInteger _age;
//   
//}


@property (null_resettable ,nonatomic, copy) NSString *name;
@property (nonatomic, assign, getter=isLogin) BOOL login;

@property (nonatomic, assign) NSInteger age;


@end

/*

 第一类:线程有关
 nonatomic:非原子性 与线程无关,通常用于单线程,速度较快。一般使用该关键字。
 atomic(默认): 原子性  与线程有关,通常用于多线程。

 第二类:内存管理有关
 strong = retain
 weak = assign

 retain:修饰的对象类型,需要内存管理
 assign(默认):基本数据类型,无需内存管理
 copy:修饰对象类型,与内存管理有关,推荐NSString类型使用copy修饰

 第三类:setter,getter
 readonly:只能调用getter方法,取值
 readwrite(默认):setter,getter方法都能使用
 getter= :给getter方法重写命名,一般使用在Bool类型。

 第四类:可空类型
 nonnull:属性值不能为nil
 nullable(默认):属性值可以为空

 ios5 之前
 1.声明下划线成员变量
 2.声明属性
 3.属性和和成员变量名关联(@synthesize)

 ios5 之后
 1.自动生成下划线成员变量
 2.自动生成setter,getter的方法声明和实现
 3.无需使用@synthesize将属性和成员变量名进行关联


 如果手动实现了setter,getter方法中的某一个,系统会自动将另一个方法配齐。

 如果手动实现setter,getter,需添加@synthesize name = _name;
 */

Human.m

#import "Human.h"

@implementation Human
{
    NSString *_name;
    NSInteger _age;
}


@synthesize name = _name;

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

    _name = name;
}

- (NSString *)name{
    return _name;
}



//无需声明和手动调用
- (NSString *)description
{
    return [NSString stringWithFormat:@"name = %@,age = %ld", _name,_age];
}
@end

深复制、浅复制

copy:只有遵守了的类才可以使用copy

        //地址相同
        NSString *string = @"hello";
        NSString *object = [string copy];
        NSLog(@"copy = %@",object);

        //浅复制:指针复制
        NSLog(@"string = %p,object = %p",string,object);

        //地址不同
        NSMutableString *mutableString = [NSMutableString stringWithFormat:@"world"];
        NSString *object1 = [mutableString copy];

        //深复制:内容复制,复制后产生新的对象。
        NSLog(@"mutable = %p, object1 = %p",mutableString, object1);

        //copy对于可变对象,是深复制,对于不可变对象,是浅复制。
        //copy后返回的对象都是不可变对象

mutableCopy 地址都不相同

NSString *string = [[NSString alloc] initWithFormat:@"hello"];
        NSMutableString *object = [string mutableCopy];

        [object insertString:@"y" atIndex:1];

        NSLog(@"object = %@",object);

        NSLog(@"string = %p, object = %p",string, object);

        NSMutableString *mutableString = [NSMutableString stringWithFormat:@"world"];
        NSMutableString *object1 = [mutableString mutableCopy];

        [object1 insertString:@"u" atIndex:2];
        NSLog(@"object1 = %@",object1);

          NSLog(@"mutableString = %p, object1 = %p",mutableString, object1);

        //mutableCopy对于可变对象或不可变对象都是深复制。并且返回的对象都是可变的。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值