iOS - 基础知识

2016-05-23  本文已影响48人  居然是村长

NSObject p = [NSObject new];
p release -> p指向的对象被销毁,内存不可用了,但是p 还存着原对象的地址,
p就成了野指针。(ARC下oc对象没有release,但是底层类还是有类似CFRelease,free等)
p = nil -> *p 为空指针,不指向任何内存地址。

野指针.png
注:p(A)原本指向B地址,存储C内容,当p release时,销毁了C内容,但是p(A)的指向依旧存在,B地址重复使用是,C内容改变,再调用p,就会异常了。也就是野指针。将p(A)=nil;就是将p(A)不再指向B。也就避免了野指针。ARC下的weak属性,会在内容销毁时自动置为nil。

ARC 下:

strong 引用计数+1
weak,copy 引用计数不+1
对象不被持有时(引用计数0),即被销毁

** 属性参数**
原子性:atomic,nonatomic
读写属性:readwrite,readonly
set方法:assign,copy,strong,weak


以下:对象类,存于堆,需要指针访问,动态分配与释放。

![Uploading strong_451854.png . . .]
    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.png
    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:

weak.png
    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:

weak1.png
    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:

weak2.png
    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);

关键字

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    static NSInteger num = 0;
//    NSInteger num = 0
    num ++ ;
    NSLog(@"%zi",num);
}
extern NSString *const CZTestNotification;// .h
NSString *const CZTestNotification = @"CZTestNotification";//.m
const 右边的内容不能修改
NSString *const name = @"";// name 值不能修改
NSString const *address = @"";// address指针不能修改

1

上一篇下一篇

猜你喜欢

热点阅读