写点什么

iOS 内存管理篇

作者:刁架构
  • 2022 年 3 月 19 日
  • 本文字数:1434 字

    阅读完需:约 5 分钟

什么情况使用 weak 关键字,相比 assign 有什么不同?

  1. 解决循环引用

  2. 本身已经强引用过了,没必要再强引用一次了。比如 IBOutlet 控件

  3. weak、assign 都不回加引用计数,当释放时,weak 的会置为 nil,此时 OC 给 nil 发消息没问题。assign 不会释放,会产生野指针,发消息可能崩溃。

  4. assign 可以修饰基本类型,weak 必须是 OC 对象


<a name="lPwRz"></a>

如何让自定义类可以用 copy 修饰符?

  1. 实现 NSCoping 协议

  2. 实现 NSMutableCoping 协议


@protocol  NSCopying ● (id)copyWithZone:(nullable NSZone *)zone;@end  
@protocol NSMutableCopying ● (id)mutableCopyWithZone:(nullable NSZone *)zone;@end
@protocol NSCoding ● (void)encodeWithCoder:(NSCoder *)coder;● (nullable instancetype)initWithCoder:(NSCoder *)coder; // NS_DESIGNATED_INITIALIZER@end
复制代码


<a name="RpwRP"></a>


<a name="wAE63"></a>

如何重写带 copy 关键字的 setter?

@property (nonatomic, copy) NSString *name;- (void)setName:(NSString *)name {_name = [name copy];}
复制代码


<a name="nvBrZ"></a>


<a name="swY6h"></a>

@property 的 NSString 为什么要使用 copy 修饰?使用 strong 会有什么问题?

答: 因为父类指针可以指向子类对象。<br />比如:可变字符串是不可变字符串的子类,这样就有可能原本想传入 NSString 的传入了 NSMutableString,外部修改后,会有影响。 但传入 copy 的话,就不会。


<a name="AcPw9"></a>

深拷贝和浅拷贝

  • 浅拷贝:每一层都是指针拷贝

  • 深拷贝:至少有一层是深拷贝

  • 完全拷贝:每一层都拷贝


非集合:


    [NSString copy];                // 浅拷贝    [NSString mutableCopy];         // 深拷贝    [NSMutableString copy];         // 深拷贝    [NSMutableString mutableCopy];  // 深拷贝
NSString *a = @"aaaa"; [a copy]; [a mutableCopy]; NSLog(@"a copy: %p, %p, %p", a, [a copy], [a mutableCopy]); NSMutableString *b = [NSMutableString stringWithString:@"bbbb"]; [b copy]; [b mutableCopy]; NSLog(@"b copy: %p, %p, %p", b, [b copy], [b mutableCopy]);

// 只有不可变字符串copy时,指针是一样的,其他都是不一样的,即其他都做了深拷贝。a copy: 0x1001d0a88, 0x1001d0a88, 0x600003960330b copy: 0x600003960330, 0xa57c26ceae7ea375, 0x600003960510
复制代码


集合:


    [NSArray copy];                // 浅拷贝    [NSArray mutableCopy];         // 单层深拷贝(只拷贝了对象,对象的元素仍然是指针)    [NSMutableArray copy];         // 单层深拷贝    [NSMutableArray mutableCopy];  // 单层深拷贝        NSArray *c = @[@"1", @"2", @"3"];    [c copy];    [c mutableCopy];    NSLog(@"c copy: %p, %p, %p, %p, %p", c, [c copy], [c mutableCopy], [c copy][0], [c mutableCopy][0]);
NSMutableArray *d = [NSMutableArray arrayWithArray:@[@"4", @"5", @"6"]]; [d copy]; [d mutableCopy]; NSLog(@"d copy: %p, %p, %p, %p, %p", d, [d copy], [d mutableCopy], [d copy][1], [d mutableCopy][1]);
// 只有不可变集合copy时,指针是一样。 // 集合里面的对象相同元素指针还是一样的。因为编译器做了优化,不可变字符只会创建一个。c copy: 0x100351c28, 0x100351c28, 0x6000031e03c0, 0x10034cb08, 0x10034cb08d copy: 0x6000031fc3f0, 0x6000031fc2a0, 0x6000031fc240, 0x10034cba8, 0x10034cba8
复制代码


发布于: 刚刚阅读数: 3
用户头像

刁架构

关注

叫我刁架构 2017.10.25 加入

预备备网红首席架构师,移动端开发者,边缘设计支持者。

评论

发布
暂无评论
iOS内存管理篇_ios_刁架构_InfoQ写作平台