NSObject p = [NSObject new];
p release -> p指向的对象被销毁,内存不可用了,但是p 还存着原对象的地址,p就成了野指针。(ARC下oc对象没有release,但是底层类还是有类似CFRelease,free等)
p = nil -> *p 为空指针,不指向任何内存地址。
注:p(A)原本指向B地址,存储C内容,当p release时,销毁了C内容,但是p(A)的指向依旧存在,B地址重复使用是,C内容改变,再调用p,就会异常了。也就是野指针。将p(A)=nil;就是将p(A)不再指向B。也就避免了野指针。ARC下的weak属性,会在内容销毁时自动置为nil。
-
避免野指针
一、指针变量初始化,要么将指针设置为NULL,要么让它指向合法的内存。
二、指针p被free或者delete之后,置为NULL。
ARC 下:
strong 引用计数+1
weak,copy 引用计数不+1
对象不被持有时(引用计数0),即被销毁
** 属性参数**
原子性:atomic,nonatomic
读写属性:readwrite,readonly
set方法:assign,copy,strong,weak
- assign:基础数据类型,数据存于栈内,编译时即确定其内存,直接赋值。
以下:对象类,存于堆,需要指针访问,动态分配与释放。
- copy:
NSMutableString *tempString = [NSMutableString stringWithString:@"123"];//
self.stringCopy = tempString;
NSLog(@"c%@",self.stringCopy);
[tempString insertString:@"00" atIndex:0];
NSLog(@"c%@",self.stringCopy);
tempString = nil;
NSLog(@"c%@",self.stringCopy);
- strong :
NSMutableString *tempString = [NSMutableString stringWithString:@"123"];//
self.stringStrong = tempString;
NSLog(@"s%@",self.stringStrong);
[tempString insertString:@"00" atIndex:0];
NSLog(@"s%@",self.stringStrong);
tempString = nil;
NSLog(@"s%@",self.stringStrong);
weak:
NSMutableString *tempString = [NSMutableString stringWithString:@"123"];//
self.stringWeak = tempString;
NSLog(@"w%@",self.stringWeak);
[tempString insertString:@"00" atIndex:0];
NSLog(@"w%@",self.stringWeak);
tempString = nil;
NSLog(@"w%@",self.stringWeak);
对比weak1:
NSMutableString *tempString = [NSMutableString stringWithString:@"123"];//
self.stringWeak = tempString;
self.stringStrong = tempString;// 新增一个strong的指针
NSLog(@"w%@",self.stringWeak);
[tempString insertString:@"00" atIndex:0];
NSLog(@"w%@",self.stringWeak);
tempString = nil;
NSLog(@"w%@",self.stringWeak);
对比weak2:
NSMutableString *tempString = [NSMutableString stringWithString:@"123"];//
self.stringWeak = tempString;
self.stringStrong = tempString;
NSLog(@"w%@",self.stringWeak);
[tempString insertString:@"00" atIndex:0];
NSLog(@"w%@",self.stringWeak);
tempString = nil;
self.stringStrong = nil;// string的指针也置空
NSLog(@"w%@",self.stringWeak);
注:猜测
NSString *tempString = @"000";
self.stringWeak = tempString;
NSLog(@"w%@",self.stringWeak);
tempString = @"999";// 虽然重新赋值了,但是原tempString 内存地址依然存在,猜测局部NSString变量self持有,并且为copy属性,所以上面使用 NSMutableString,修改时,地址不变。
NSLog(@"w%@",self.stringWeak);
tempString = nil;
NSLog(@"w%@",self.stringWeak);
关键字
- static 静态全局变量:
简单说:只能在某处调用,但拥有全局变量的生命周期。
定义在方法内部:只能方法内部使用。
定义在类:与全局变量类似,只供类内部使用。
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
static NSInteger num = 0;
// NSInteger num = 0
num ++ ;
NSLog(@"%zi",num);
}
- extern 供外部使用,大概意思我定义过了,你拿去用吧,一般用于全局常量,如通知名称
extern NSString *const CZTestNotification;// .h
NSString *const CZTestNotification = @"CZTestNotification";//.m
- const 常量:
const 右边的内容不能修改
NSString *const name = @"";// name 值不能修改
NSString const *address = @"";// address指针不能修改
1