天天看點

oc學習筆記1

#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

繼續閱讀