iOS - 基礎知識

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 什么是KVC,什么是KVO,他們之間關系.底層實現 鍵值編碼 Key-Value-Coding(KVC) 鍵值編碼...
    Civel_Xu閱讀 1,345評論 3 10
  • 4月10號跟公司提了辭職。說好不會立馬走,留一兩個月的緩沖期給公司。這樣一來,立馬辭職投簡歷找工作的計劃也就擱淺...
    tiGress閱讀 830評論 1 4
  • 多線程、特別是NSOperation 和 GCD 的內部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,035評論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,013評論 0 7
  • 上個星期,黨支部組織活動,作為宣傳委員的我負責督促還沒完成活動內容的同事,編輯好微信內容,找到通訊錄里的“羽”,發...
    藍莓歡歌閱讀 403評論 1 6