iOS 内存管理(4)-异常注意点

1 iOS之property里的copy、strong区别

直接看代码吧

#import <Foundation/Foundation.h>

@interface ZJPerson : NSObject

@property (nonatomic,copy) NSString * name;

@property (nonatomic,strong) NSString * StrongName;

@end

NSMutableString * name = [NSMutableString stringWithFormat:@"iOS俱哥"];

ZJPerson * p = [[ZJPerson alloc]init];
p.name = name;
p.StrongName = name;
// 不能改变p.name的值,因为其内部copy新的对象
//改变了p.StrongName的值,因为StrongName和name指向了同一块内存
[name appendString:@"!!!"];

NSLog(@"p.name = %@",p.name);
NSLog(@"p.StrongName = %@",p.StrongName);

NSLog(@"name:%p,p.name:%p,p.StrongName:%p",name,p.name,p.StrongName);
打印.png

注:在strong情况下,如果外部被引用的变量更改了,那里面这个值也会更改,因为两个属性指向同一块内存空间 。在这里strong 属于浅拷贝,只赋值对象的指针。
为了防止外界修改name,就用copy,因为copy是生成了一份新的内存空间,,所以外界是不能修改值。

2iOS viewController不会调用dealloc()不会销毁

此处之前的文章已经讲解过,但是依然提一下,之前也已经说过 ,不过个人觉得是个重点,重要的事情说3遍

@property (nonatomic, weak) id<SomeDelegate> delegate;

提到 delegate,有一点,在 MRC 时代,delegate 是使用 assign 修饰的。那时候需要在 dealloc 中将 delegate 置空,不然会存在悬空指针,而现在使用 weak 会自动赋值为 nil。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容