• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

objective-c - 关于保留和复制

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:37:49 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我以为我已经理解了 retaincopy 之间的区别。但是当我遇到下面的代码时,我再次感到困惑。这些是代码:

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    NSMutableString *a;
    NSMutableString *b;
    NSMutableString *c;
}

@property (nonatomic, copy) NSMutableString *a;
@property (nonatomic, copy) NSMutableString *b;
@property (nonatomic, copy) NSMutableString *c;

@end

ViewController.m:

#import "ViewController.h"

@implementation ViewController

@synthesize a, b, c;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.a = [[NSMutableString alloc] initWithFormat"%@", @"aaa"];
    NSLog(@"a:%d", a.retainCount);

    self.b = a;
    NSLog(@"a:%d", a.retainCount);
    NSLog(@"b:%d", b.retainCount);

    self.c = b;
    NSLog(@"a:%d", a.retainCount);
    NSLog(@"b:%d", b.retainCount);
    NSLog(@"b:%d", c.retainCount);
}

@end

谁能解释一下为什么会这样:

2011-12-31 16:54:50.244 RetainCopy[5783:207] a:1
2011-12-31 16:54:50.246 RetainCopy[5783:207] a:2
2011-12-31 16:54:50.246 RetainCopy[5783:207] b:2
2011-12-31 16:54:50.247 RetainCopy[5783:207] a:3
2011-12-31 16:54:50.247 RetainCopy[5783:207] b:3
2011-12-31 16:54:50.248 RetainCopy[5783:207] b:3

?谢谢。



Best Answer-推荐答案


首先,-retainCountuseless to you .

第二,一个误解是在复制属性的实现中。您没有像预期的那样在这里获得副本。相反,您得到的是 [arg copy] 而不是 [arg mutableCopy] 的结果。许多不可变类型像这样“复制”自己(简化):

- (id)copyWithZoneNSZone*)zone
{
  return [self retain];
}

所以结果最终会是:

NSMutableString * a = [[NSMutableString alloc] initWithString"aaa"];
NSString * b = [a copy]; // << returns an immutable copy!
NSString * c = [b copy]; // << immutable to immutable probably just retains itself!

由于它们是不可变的和纯粹的,这在语义上是合理的。这也意味着如果类型区分不可变副本和可变副本,您将需要自己实现可变类型的副本访问器。否则,当您尝试改变 ivar 时,您的程序可能会崩溃,因为您持有一个不可变的实例。如果将此添加到 -viewDidLoad 的末尾,您应该会看到一个异常:[self.c appendString"uh-oh"];

More detail on implementing a mutable property here .

关于objective-c - 关于保留和复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687270/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap