美文网首页
iOS - 基础知识

iOS - 基础知识

作者: 居然是村长 | 来源:发表于2016-05-23 20:44 被阅读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。
  • 避免野指针
    一、指针变量初始化,要么将指针设置为NULL,要么让它指向合法的内存。
    二、指针p被free或者delete之后,置为NULL。

ARC 下:

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

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


  • assign:基础数据类型,数据存于栈内,编译时即确定其内存,直接赋值。

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

  • copy:
![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 :
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);

关键字

  • 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

相关文章

网友评论

      本文标题:iOS - 基础知识

      本文链接:https://www.haomeiwen.com/subject/gtoarttx.html