#import是一個預處理指令,作用跟C語言的#include類似,都是 包含(拷貝)某個檔案的内容 到 預處理指令所在的位置. #import <Foundation/Foundation.h>表示包含Foundation架構中的Foundation.h檔案。
在C\C++中,我們用#include來包含頭檔案,缺點就是同一個頭檔案可能被包含多次。在OC中,就使用#import來包含頭檔案,優點是可以自動防止同一個頭檔案被包含多次。#import <...>表示包含系統自帶的檔案,#import "..."表示包含開發人員自己建立的檔案.
1.建立一個類産生.h和.m兩個檔案,.h中對用到的變量、方法作聲明,.m檔案中實作,導入時隻導入.h檔案,如果直接把方法寫在.m檔案中,未在.h檔案中進行聲明,則是私有方法 [email protected] 類名 :NSObject @end,代表聲明一個類,冒号表示繼承,不可省,要使用OC中常用的類,那麼#import <Foundation/foundation.h>,Foundation架構内有個foundation.h檔案,其中包括NSObject。 3.- (int) getAge;聲明函數,-代表動态方法,即有對象才調用的方法,聲明靜态方法前用+ 方法後有幾個冒号就有幾個參數,類型用括号包覆 4.實作方法時方法名後不帶括号 5.建立類的對象,先調用靜态方法alloc配置設定記憶體:[類名 alloc],Student *stu=[Student alloc],OC對象一定是指針 6.開發中這樣建立對象,Student *stu=[[Student alloc] init];構造方法init用于初始化,可自己編寫 7.調用對象方法,[對象名 方法] 8.自己寫一個構造方法(動态的),方法名以init開頭,自定義構造方法首先要調用父類構造方法(原因很簡單),[super init] 9.%@占位符代表列印一個對象,列印對象會調用description方法 10.所有的OC對象都要用指針來指向它,定義一個字元串,NSString *[email protected]”itcast”; 11.成員變量前要加下劃線,_age,_number,預設的規則 12.點文法的本質是調用set方法和get方法 12.當編譯器遇到@property時,會自動展開get方法和set方法的聲明 [email protected] age,height,number,實作三個變量的方法 14.給對象發送某條消息相當于調用該對象的該方法 15.類名和*是離不開的,除非繼承聲明時 16.如果自己手動實作了getter和setter,xcode就不會自動生成@synthesize,也就不會自動生出下劃線的變量 17.類内部定義的變量預設作用域是protect的,隻能在類内部和子類中通路,提供get方法和set方法供外部通路 18.動态方法内部的self是指調用目前對象,靜态方法内的self是指類名 19.在.h檔案中聲明的方法是公共方法,不聲明而直接寫在.m檔案中的方法是私有方法,隻有.m檔案中能使用該方法 20.stu.age=100本質是調用了set方法,int age= stu.age本質調用了get方法 21.Student *stu=[Student new]相當于Student *stu=[[Student alloc] init],但前者不能調用自己寫的構造方法 22.在.m檔案中用了@synthesize,那麼在.h檔案中的成員變量定義可省略,因為該變量會在.m檔案中自動生成,但是是私有的 [email protected] age;預設通路與age同名的變量,如果找不到則自動生成 [email protected] age = _age,代表getter和setter會去通路_age,如果沒有_age也會自動生成。那為啥不直接@synthesize _age啊我去 25.Xcode4.5之後的版本,如果在.h檔案中使用@property age,則會在.m檔案中自動生成@synthesize,即自動生成getter和setter,預設通路的是_age變量(也是自動生成) 26.Xcode關閉arc:在開發中的項目在項目設定的build setting中搜尋garbage關鍵字就可以看到這個選項了,然後選擇NO再次運作各種release就不會報警了 27.驗證dealloc方法是否被使用時需要重寫父類的dealloc方法,[super dealloc]; 28.OC注釋:pragma mark,好處是可以快速定位注釋位置 29.指向已經釋放的記憶體的指針叫野指針,沒有指向任何的東西指針叫空指針,OC中野指針會報錯,空指針不會報錯 30.set方法的記憶體管理:隻針對參數是對象的set方法,參數是變量的不涉及記憶體管理
31.Student的set方法的參數是類Book的對象時,類Book産生了book對象後要自己釋放掉,Student産生的對象stu第一次使用該book對象時要在set方法中對book做retain操作:_book =[book retain],在dealloc方法中對book作release操作:[_book release],第二次使用book2對象要先在set方法中作release,指派後再做retain,則可多次使用,該操作要先判斷目前對象與參數是否相同,一般這樣寫: if(_book!=book){ [_book release]; _book=[book retain];} 這樣寫的原因再次看視訊,語言不好表達 32.retainCount方法擷取 對象目前計數器的值 33.在.h檔案中聲明對象時用到某個類,用@class關鍵字聲明,在.m檔案中實作時再用import導入,這樣可提高編譯性能 34.兩個類互相擁有對方時,隻能用@class而不能用import,原理是C語言兩個檔案中不能互相擁有 35.property參數,retain,作用是實作方法時會release舊值,再retain新值 36.property參數,預設是readwrite,代表既生出get方法又set方法,寫readonly時隻生出get方法 37.property參數,預設是atomic,提供方法多線程調用,給get方法和set方法加鎖,保證線程安全,nonatomic代表方法不需要考慮線程安全(禁止多線程調用,可提高性能) 38.文法:property(nonatomic,retain)Book *book;代表book的兩個方法不加鎖,且需要管理記憶體 39.getter和setter也可作為property參數,getter = what ,代表getter的方法名是what 40.[stu autorelease]不會改變對象的計數器值,隻是将stu添加到自動釋放池中 41.自動釋放池被銷毀時,裡面的所有對象都會調用release方法計數器減一 42.常用寫法Student *stu = [[[Student alloc] init] autorelease]; 43.寫一個靜态方法快速建立對象,方法名最好與類名相同 44.系統自帶的類如NSString,都是已經autorelease的,不需要再進行autorelease操作 45.靜态方法建立的對象都是自動釋放的,自己建立的靜态方法(如快速建立對象)需要在方法實作中調用autorelease方法 46.靜态方法不能通路對象的成員變量 47.垃圾回收機制:完全不用管理記憶體 ARC:編譯器自動生成管理記憶體的代碼 48.不要把大量循環的代碼放在同一個自動釋放池中,浪費記憶體 49.盡量不要把占用記憶體大的對象放入自動釋放池 50.Category,可以在不改變已經存在的一個類的前提下為該類添加一個新的方法,相當于該類的拓展 51.類名後面有冒号代表繼承,類名後面有括号代表分類,括号裡是分類名稱 52.分類隻能擴充方法,不能增加成員變量 53.Protocol相當于JAVA中的接口,但其中聲明的方法可以不全部實作 54.類名(或協定)後面有<>代表實作某個協定,一般是NSObject 55.隻有實作了某個協定的對象才能充當按鈕的監聽器 56.Block:将一段代碼封裝到block中,可在任何時候調用這段代碼
wifi密碼85205233
cd Desktop/ 進入桌面
touch xxx.m 建立檔案
open xxx.m 打開檔案
cc -c xxx.m 編譯
cc xxx.o 連結
cc xxx.o -Framework Foundation 連結
cc one.o two.o -framework Foundation 多個檔案編譯
ls -l *nix指令,以長格式的形式檢視目前目錄下所有檔案。
./a.out 輸出檔案 a.out 是linux/unix環境下gcc編譯源代碼(c/c++)并連接配接産生的預設執行檔案名。
./a.out表示目前目錄下的a.out檔案。一個單獨的點号指代目前檔案路徑。
因為linux/unix搜尋可執行檔案的預設路徑需要指定,
沒有./兩個符号指定路徑的話,新編譯的檔案作業系統找不到。
clear 清屏
typedef enum{
XX**;
XX**;
} XX; //建立一個枚舉類型
typedef struct{
}XXX; //建立一個結構體
typedef 聲明,為現有類型建立一個新的名字。
類方法是 +開頭 隻能由類來調用
對象方法是 -開頭 隻能由對象調用
類方法相當于java的靜态方法
self 相當于java的this
#pragma mark - 加-會有線 注釋
@property 生成set,get方法的聲明
@synthesize 生成set,get方法的實作
引用計數器操作
給對象發送一條retain消息,可以使引用計數器值+1(retain方法傳回對象本身)
給對象發送一條release消息,可以使引用計數器值-1
可以給對象發送retainCount消息獲得目前的引用計數器值
當對象被銷毀時,系統會發一條dealloc 用于重寫
garbage 野指針: 指向 僵屍對象(不可用記憶體)的指針
nil相當于java的 null
oc不存在空指針錯誤,給空指針發送消息,不報錯
edit Scheme ->Diagnostics->勾選 Enable zombie objects (檢測僵屍對象)
set方法
if(_car != car){
[_car release];
_car = [_car retain];
}
兩個類互相包含的時候會導緻循環引用 : A申明B.h B申明A.h
循環引用解決:
@class僅僅告訴編譯器,A是一個類 (送出編譯效率)
1>在.h檔案中用@class來聲明類
2>在.m檔案中用#import來包含類的所有東西
#import是拷貝 用這個會降低編譯效率 (例子:假如你有100個類引用了A. 如果A有一點更改,那麼這100個類都需要重新編譯一次)
3.兩端循環引用解決方案
1>一端用retain
2>一端用assign
ARC的判斷準則: 隻要沒有強指針指向對象,就會釋放對象
指針分兩種:
1>強指針:預設情況下,所有的指針都是強指針 __strong
2>弱指針: __weak
1.ARC特點
1>不允許調用 release,retain,retainCount
2>允許重寫dealloc 但不允許調用[super dealloc]
3>@property的參數
* strong : 成員變量是強指針, 相當于原來的retain(适用于OC對象類型)
* weak : 成員變了是弱指針, 相當于原來的assign (适用于oc對象類型)
* assign : 适用于飛oc對象類型
當兩端循環引用的時候,解決方案:
一端用strong,一端用weak
搜auto可以檢視是否是arc模式
-fno-objc-arc(arc模式下)設定類不是arc模式
-f-objc-arc (非arc模式下)表示需要arc
block用來儲存一段代碼
block的标志 ^
block跟函數很像
1.可以儲存代碼
2.有傳回值
3.有形參
4.調用方式一樣
block内部可以通路外面的變量
預設情況下,block内部不能修改外面的局部變量
局部變量隻有前面加上__block關鍵字。這個局部變量就可以在内部修改.:__block int b = 30;
傳回類型 (^名稱)(int,int) = ^(int a,int b){
return a+b;
};
int (^名稱)();
名稱 = ^{return int};
typedef int (^MyBlock) (int int);
protocol
隻要一個類遵守了某個協定,就能擁有這份協定中所有方法申明
1.協定的定義
@protocol 協定名稱 <NSObject>
//方法聲明清單
@end
2.如何遵守協定
1>類遵守協定
@interface 類名 : 父類名 <協定名稱1,協定名稱2>
@end
2>協定遵守協定
@protocol 協定名稱<其他協定名稱1,其他協定名稱2>
@end
3.協定中方法聲明的關鍵字
@required 要求實作,不實作就會發出警告(預設)
@optional 不要求實作
4.定義一個變量的時候,限制這個變量儲存的對象遵守某個協定
類名 <協定名稱> *變量名;
id <協定名稱> 變量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
5,@property中聲明的屬性也可以用做一個遵守協定的限制
@property(nonatomic,strong) 類名 *屬性名;
@property(nonatomic,assign) 類名 屬性名;
6.協定可以定義在單獨.h檔案中,也可用定義在某類中
1>如果這個協定隻用在某個類中,應該把協定定義在類中
2>如果這個協定隻用在很多類中,應該把協定定義在單獨檔案中
7.分類可以定義在單獨.h檔案中,也可用定義在原來類中
一般情況下都是定義在單獨檔案中
NSRange
NSPoint\CGPoint
NSSize\CGSize
NSRect\CGRect
當Range.location在字元串中不存在就 == NSNotFound