首先我們來找一下每個區域內的記憶體位址
棧int a=10;
nslog(@"%p",&a);
//堆
int *p=malloc(40);
nslog(@"%p",p);
//全域性靜態區
static int b=10;
nslog(@"%p",&b);
//常量區
//常量字串,儲存的是首位址
char *str="iphone";
nslog(@"%p",str);
//**區
nslog(@"%p",maxvalue);
一.block的四種形式
1.無引數,無返回值
void(^block)()=^();
//block的使用
block();
//block自己不會執行,必須呼叫才會執行block大括號裡的**段.
2.有引數,無返回值
void(^block1)(nsinteger,nsinteger)=^(nsinteger a,nsinteger b);
block1(10,5);
//void(^)(nsinteger,nsinteger)是block的型別,它的名是block,我們也通過名進行呼叫
void(^block)(nsstring *)=^(nsstring *str);
block(@"qqqqqqq");
//引數是乙個陣列,對陣列進行遍歷
void(^block)(nsarray *)=^(nsarray *arr)};
nsarray *arr=@[@"2",@"3"];
block(arr);
3.無引數,有返回值
nsinteger是長整型
nsinteger(^block)()=^();
//block呼叫沒有引數也要加上括號
nslog(@"%ld",block());
4.有引數
,有返回值
nsstring *(^block)(nsarray *,nsinteger)=^(nsarray *arr,nsinteger index);
nslog(@"%@",block(@[@"1",@"2"],1));
二.用typedef來給block重新命名
typedef nsstring *(^block)(nsarray *);
即 block就是block的新名字,在main.m中
block block=^(nsarray *arr)
來重新建立乙個block
三,block和區域性變數
__block相當於給a乙個在block中修改的許可權,否則它只是取值,不能賦值.
__block int a=10;
void (^block)()=^();
block();
如果在外面不寫上_block則裡面會報錯,因為a的值是不予許被改變的
四.通過block對陣列進行遍歷
nsarray *arr=[nsarray arraywithobjects:@"2",@"1",@"3",@"4", nil];
//系統的block
[arr enumerateobjectsusingblock:^(id obj, nsuinteger idx, bool *stop) ];
五.陣列排序
//陣列對字串的排序
//不可變陣列
nsarray *arr=@[@"asd",@"sda",@"wea",@"adv"];
//sel是方法選擇器
nsarray *newarr=[arr sortedarrayusingselector:@selector(compare:)];
nslog(@"%@",newarr);
nslog(@"%@",arr);
//可變陣列
//nsmutablearray *arr=[nsmutablearray arraywithobjects:@"asd",@"sda",@"wea",@"adv", nil];
[arr sortusingselector:@selector(compare:)];
nslog(@"%@",arr);
//對物件進行排序
//新建4個人的物件
person *per1=[person basewithname:@"asd"***:@"nan"];
person *per2=[person basewithname:@"ashdja"***:@"nan"];
person *per3=[person basewithname:@"wqe"***:@"nan"];
person *per4=[person basewithname:@"adw"***:@"nan"];
nsarray *arr=@[per1,per2,per3,per4];
nsarray *newarr=[arr sortedarrayusingcomparator:^nscomparisonresult(person *obj1, person *obj2) ];
for (person *per in newarr)
nsmutablearray *marr=[nsmutablearray arraywithobjects:per1,per2,per3,per4, nil];
[marr sortusingcomparator:^nscomparisonresult(id obj1, id obj2) ];
for (person *per in marr)
六.多型
所謂的多型性,就是以乙個類作為根類,然後每個類都繼承這個類,這樣只要寫乙個根類的便利構造方法
就可以實現每個類都會呼叫這個方法,可以節省**
+ (id)basewithname:(nsstring *)name
***:(nsstring *)***六
oc中block的理解
block可能是我在學習objective c語法中遇到的第乙個puzzle的地方。確實,這個語法takes some getting use to.block實際是一種閉包,它是oc中對閉包的實現。閉包是什麼?清楚地記得這個是我去年在參加鵝廠的實習筆試的時候的乙個大題,記得沒錯是第二個大題。any...
OC 中的block使用
在ios的開發過程中,使用塊的地方很多也很方便,但是在使用塊的過程中要注意記憶體洩露的問題。在塊建立的時候,會對塊內的所有物件的引用計數加一,直到塊銷毀,所以在使用塊的過程中需要我們進行處理,在這裡以afnetworking的 舉例,如下 weak typeof self weakself self...
oc中的多型
首先從多型的定義來說 用乙個父類的指標指向子類的物件,在函式 方法 呼叫的時候可以呼叫到正確版本的函式 方法 使用多型的條件 1.子類必須重寫父類的方法 2.父類指標指向子類物件 多型的應用場景 用乙個父類的指標指向子類的物件 1.建立乙個human類 property nonatomic,stro...