对不同类型assgin,retain,和copy内部实现的方法

本文详细介绍了书类对象的属性(书名、厚度、类型、价格、出版社、出版时间)及其对应的getter和setter方法,并展示了read和write方法的基本用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.h文件。。。。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@interface book : NSObject
/*{
   
    NSString *_bookName;    //书名
    CGFloat _bookThickness; //厚度
    NSString *_bookType;      //书类型
    NSInteger _bookPrice;     //书价格
    NSString *_publishingHouse;//出版社
    NSString *_publishintTime;  //出版时间
}*/  //在@property里面,其实就包含了定义实例变量,setter方法和getter方法。这里可以不用在定义实例变量了
@property (nonatomic , copy)NSString *bookName;//用copy写完整的属性
@property (nonatomic , assign)CGFloat bookThickness;
@property (nonatomic , retain)NSString *bookType;//retain不建议使用,大多使用copy
@property (nonatomic , assign)NSInteger bookPrice;
@property (nonatomic , copy)NSString *publishingHouse;
@property (nonatomic , copy)NSString *publishintTime;
- (void)read;
- (void)write;
@end


.m文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
@implementation book
@synthesize bookName = _bookName ;
@synthesize bookThickness = _bookThickness;
@synthesize bookType = _bookType;
@synthesize bookPrice = _bookPrice;
@synthesize publishingHouse = _publishingHouse;
@synthesize publishintTime = _publishintTime;
- (void)setBookName:(NSString *)bookName
{
    if (_bookName != bookName) {
        [_bookName release];//auto---All---Combined---Language--Objective C--->no这里是对内存的一个设置,
        _bookName = [bookName copy];
    }
}
- (NSString *)bookName
{
    return  [[_bookName retain] autorelease];
}
- (void)setBookThickness:(CGFloat)bookThickness
{
    _bookThickness = bookThickness;
}
- (CGFloat)bookThickness
{
    return _bookThickness;
}
- (void)setBookType:(NSString *)bookType
{
    if (_bookType != bookType) {
        [_bookType release];
        _bookType = [bookType retain];//retain和copy唯一的不同在这里。
    }
}
- (NSString *)bookType
{
    return [[_bookType retain] autorelease];
}
- (void)setBookPrice:(NSInteger)bookPrice
{
    _bookPrice = bookPrice;
}
- (NSInteger)bookPrice
{
    return _bookPrice;
}
- (void)setPublishingHouse:(NSString *)publishingHouse
{
    if (_publishingHouse != publishingHouse) {
        [_publishingHouse release];
        _publishingHouse = [publishingHouse copy];
    }
}
- (NSString *)publishingHouse
{
    return [[_publishingHouse retain] autorelease];
}
- (void)setPublishintTime:(NSString *)publishintTime
{
    if (_publishintTime != publishintTime) {
        [_publishintTime release];
        _publishintTime = [publishintTime copy];
    }
}
- (NSString *)publishintTime
{
    return  [[_publishintTime retain] autorelease];
}
- (void)read;
{
    NSLog(@"这是一本书");
}
- (void)write
{
    NSLog(@"可以写");
}
@end

 

### JavaScript `Object.assign` 的使用方法及常见问题 #### 使用方法 `Object.assign` 是 JavaScript 中的一个内置方法,用于将所有可枚举的自身属性从一个或多个源对象复制到目标对象。其基本语法如下: ```javascript Object.assign(target, ...sources); ``` 其中: - **`target`**:目标对象,该对象会被修改并将作为最终的结果返回。 - **`...sources`**:一个或多个源对象,它们的属性将会被复制到目标对象。 当存在同名属性时,后续源对象中的属性值会覆盖先前已存在的属性值[^1]。 下面是一个简单的例子来展示如何使用 `Object.assign` 进行对象合并: ```javascript const object1 = { a: 1, b: 2 }; const object2 = { b: 3, c: 4 }; const mergedObject = Object.assign({}, object1, object2); console.log(mergedObject); // 输出: { a: 1, b: 3, c: 4 } ``` 在这个例子中,`object1` `object2` 被合并成一个新的对象 `mergedObject`,而原始对象保持不变[^4]。 --- #### 常见问题 ##### 1. 属性覆盖行为 如果多个源对象中有相同的键,则后面的值会覆盖前面的值。例如: ```javascript const target = { a: 0, b: 0 }; const source1 = { a: 1 }; const source2 = { b: 2 }; const returnedTarget = Object.assign(target, source1, source2); console.log(returnedTarget.a); // 输出: 1 console.log(returnedTarget.b); // 输出: 2 ``` 这里可以看到,`source1` 的 `a` 键 `source2` 的 `b` 键分别覆盖了 `target` 对象中原有的值[^5]。 ##### 2. 浅拷贝而非深拷贝 需要注意的是,`Object.assign` 只执行浅拷贝而不是深拷贝。这意味着对于嵌套的对象结构,仅引用会被复制,而不复制实际的内容。例如: ```javascript const obj1 = { innerObj: { key: 'value' } }; const obj2 = Object.assign({}, obj1); obj2.innerObj.key = 'new value'; console.log(obj1.innerObj.key); // 输出: 'new value' ``` 上述代码表明,更改 `obj2` 中嵌套对象的属性也会反映在原对象上,因为两者共享同一个引用[^2]。 ##### 3. 不会影响不可枚举属性 `Object.assign` 只处理可枚举的自有属性,因此不会复制那些定义为不可枚举的属性。例如: ```javascript const original = {}; Object.defineProperty(original, 'foo', { enumerable: false, value: 'bar', }); const copy = Object.assign({}, original); console.log(copy.foo); // undefined ``` 在这里,“foo” 属性由于设置为不可枚举,所以未被复制到新对象中[^3]。 --- #### 总结 通过以上分析可以看出,`Object.assign` 是一种简单有效的方式来实现对象之间的数据转移以及基础层次上的对象合并功能。然而,在涉及复杂的数据结构或者特殊需求场景下(比如深层克隆),则可能需要额外考虑其他解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值