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

1 iOS之property里的copy、strong区别

直接看代码吧

#import 

@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 delegate;

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

你可能感兴趣的:(iOS 内存管理(4)-异常注意点)