OC中的Block,多型

2021-07-04 04:07:07 字數 2925 閱讀 2171

首先我們來找一下每個區域內的記憶體位址

棧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...