溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Block和屬性

發(fā)布時(shí)間:2020-07-01 12:16:23 來(lái)源:網(wǎng)絡(luò) 閱讀:768 作者:Im劉亞芳 欄目:開(kāi)發(fā)技術(shù)
#import <Foundation/Foundation.h>
typedef void(^MyBlock)();
typedef NSString *(^test)();
//int number=300;
//int (int x, int y)
//{
//    int sum;
//    sum = (x + y);
//    return sum;
//}
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        
//        int a = 3, b = 4;
//        printf("%d\n",(a, b));
//       
        int (^p) (int, int);
        p = ^int (int x, int y)
        {
            int sum;
            sum = (x + y);
            return sum;
        };
        //類(lèi)型:int (^)(int ,int)
        NSLog(@"sum == %d", p(3, 7));
        //block;本質(zhì)上是匿名函數(shù),于函數(shù)十分相似
        //返回值類(lèi)型 (^變量名)(行參數(shù)) = ^返回值類(lèi)型(行參){函數(shù)實(shí)現(xiàn)};
        //Block 的四種不同類(lèi)型
        //1,無(wú)法返回值,無(wú)參數(shù)
        void (^firstBloack)() = ^void{
            NSLog(@"This is my FirstBlock");
        };
        //調(diào)用Bloack--聲明作用。。
        firstBloack();
        //2.無(wú)返回值,有參數(shù)
        void (^secondBloack)(NSString *str) = ^void(NSString *str){
            NSLog(@"%@是2B", str);
        };
        secondBloack(@"泥煤");
        //3.有返回值,無(wú)參數(shù)
        NSString *(^thirdBloack)() = ^NSString *(){
            return @"希望世界和平";
        };
        NSLog(@"%@",thirdBloack());
//        thirdBloack();
        //4.有返回值,有參數(shù),
        //返回值類(lèi)型 (^變量名)(行參數(shù)) = ^返回值類(lèi)型(行參){};
        NSString *(^fourthBlock)(NSString *str1, NSString *str2) = ^NSString *(NSString *str1, NSString *str2){
            
            return [str1 stringByAppendingString: str2];
        };
        NSLog(@"%@",fourthBlock(@"liu", @"yafang"));
        
        //聯(lián)系,,IOS4中才有Block
        int (^getBlock)(NSString *str) = ^int (NSString *str){
            return [str intValue];
        };
        NSLog(@"%d",getBlock(@"9d1a2"));
        
        //Block和變量。。
        //在main函數(shù)里 在block外聲明的局部變量在block內(nèi)部調(diào)用時(shí)相當(dāng)于有const修飾 不能修改變量的值.這時(shí)候我們通過(guò)__block來(lái)修飾變量改變這種模式.集體實(shí)現(xiàn)方式為:如果在block中訪問(wèn)全局變量就不需要__block修飾
        //當(dāng)變量不加下劃線下劃線block即:__block (局部變量)在block內(nèi)使用時(shí)當(dāng)做常量來(lái)使用是readonly的,不能修改
       // __block的作用告訴編譯器,編譯時(shí)在block內(nèi)部不要把外部變量當(dāng)做常量來(lái)使用,還當(dāng)做變量來(lái)使用
        
//        static int number = 300;  //還可以利用靜態(tài)來(lái)休哥局部變量
        __block int number=300;  //__block修改變量,,,,全局和局部 ,,,
        MyBlock changeNumberBlock //代替下面注釋的
       /* void(^changeNumberBlock)( ) */= ^void(){
            number = 400;
        };
        changeNumberBlock();
        NSLog(@"%d", number);
        //1.Block可以直接修改全局變量
        //2.Block可以訪問(wèn)局部變量,但不能直接修改局部變量的值,如果需要修改,在變量類(lèi)型前面添加__block關(guān)鍵字
        
#pragma mark - typedef;
//        NSInteger
        MyBlock changeNumberBlock1 = ^void(){
            number = 100;
        };
        changeNumberBlock1();
        NSLog(@"%d", number);
        
        test append = ^NSString *(NSString *str1, NSString *str2){
            return [str1 stringByReplacingOccurrencesOfString:str1 withString:str2];
        };
        NSLog(@"%@",append(@"liu1", @"liuxiaomeng0"));
        
         test replace = ^NSString *(NSString *str1, NSString *str2){
             return [str1 stringByReplacingCharactersInRange:NSMakeRange(0, 2) withString:str2];
         };
        
        NSLog(@"%@", replace(@"liyafang", @"liu"));
        
        
        
        
    }
    return 0;
}

/////----下面轉(zhuǎn)載于光遠(yuǎn)------////

block  注意實(shí)現(xiàn)形式

基本語(yǔ)法: 本質(zhì)上是匿名函數(shù),與函數(shù)真真十分相似 

稱(chēng)之為函數(shù)的實(shí)現(xiàn)部分,返回值省略不寫(xiě)  

變量block的類(lèi)型 int (^)(int x, int y) 變量名字:block 可以為任意符合變量命名規(guī)范的名
=右邊的block用來(lái)存儲(chǔ)函數(shù) 初始值是一個(gè)函數(shù)的實(shí)現(xiàn)部分
        
int (^block)(int x ,int y) = ^(int x,int y){
            
return x + y;
        };
//相當(dāng)于語(yǔ)句的定義,結(jié)尾加分號(hào)要注意

當(dāng)把函數(shù)的實(shí)現(xiàn)賦給block之后,block變量就可以當(dāng)做函數(shù)名來(lái)使用 

如:int sum = block(5,10);

        NSLog(@"sum = %d",sum);


 int (^block1)(int x,int y) = ^(int x,int y){

            return x > y ? x : y;
            };  初值的實(shí)現(xiàn)部分 

        
int max = block1(5,19);
        
NSLog(@"max = %d",max);
        
 
int (^block3)(int x,int y) = ^(int x,int y){
            
return x < y ? x : y;
        };
        
int min = block3(5,19);
        
NSLog(@"min = %d",min);


1.另外:也可以用對(duì)block進(jìn)行typedef 

如:數(shù)據(jù)類(lèi)型:void(^)() BLOCK新的變量類(lèi)型名
        typedef void(^BLOCK)();

        BLOCK  sayHi = ^(){
            
NSLog(@"hello");
        };
        sayHi();//調(diào)用無(wú)參的函數(shù) 函數(shù)名+();

類(lèi)比于函數(shù)指針.


2.還需注意:在main函數(shù)里 在block外聲明的局部變量在block內(nèi)部調(diào)用時(shí)相當(dāng)于有const修飾 不能修改變量的值.這時(shí)候我們通過(guò)__block來(lái)修飾變量改變這種模式.集體實(shí)現(xiàn)方式為:如果在block中訪問(wèn)全局變量需要__block修飾

         當(dāng)變量不加下劃線下劃線block:__block (局部變量)block內(nèi)使用時(shí)當(dāng)做常量來(lái)使用是readonly,不能修改
         
__block的作用告訴編譯器,編譯時(shí)在block內(nèi)部不要把外部變量當(dāng)做常量來(lái)使用,還當(dāng)做變量來(lái)使用 
        
__block int a  = 10;
        
int (^max1)(int ,int )= ^(int x ,int y){
            a = 
20;
            
b = 30;
            
return
 x *a;
        };

(1)相同函數(shù)名的處理機(jī)制:對(duì)于定義在不同函數(shù)的相同名的兩個(gè)變量.如果想要同時(shí)使用就把兩者定義成為static變量 static int b = 120;,如果想要在一個(gè)函數(shù)里使用另一函數(shù)的全局變量,就使用extern進(jìn)行導(dǎo)入.extern int b;


28.屬性 用來(lái)替代settergetter,使用屬性可以快速創(chuàng)建settergetter的聲明,添加了設(shè)置實(shí)例變量操作的安全處理

setter 方法的作用 為單一的變量賦值

規(guī)范寫(xiě)法:-號(hào)方法 無(wú)返回值 有參數(shù) 名字以:set開(kāi)頭+實(shí)例變量名(首字母大寫(xiě)):(setter方法有且只有一個(gè)參數(shù)) + 參數(shù)類(lèi)型(和實(shí)例變量類(lèi)型相同) + 參數(shù)名(和實(shí)例變量名相同)
getter方法的作用 獲取單一的實(shí)例變量值
規(guī)范寫(xiě)法: _號(hào)方法 有返回值(返回值類(lèi)型和實(shí)例變量類(lèi)型相同方法名和實(shí)例變量相同 無(wú)參數(shù)
屬性,用來(lái)替代settergetter,使用屬性可以快速創(chuàng)建settergetter的聲明,添加了設(shè)置實(shí)例變量操作的安全處理
@property屬性 NSString* 類(lèi)型和實(shí)例變量類(lèi)型相同 name 屬性名和實(shí)例變量名相同
切記:@property只是自動(dòng)生成settergetter的聲明部分
類(lèi)型相同是可以寫(xiě)一行
屬性特性
1.讀寫(xiě)特性 readonly readwrite
    1.readonly 
告訴編譯器,屬性在自動(dòng)生成方法時(shí)只會(huì)生成getter 不會(huì)生成setter方法
    2.readwrite 
告訴編譯器,屬性在自動(dòng)生成方法時(shí),會(huì)生成為settergetter.系統(tǒng)默認(rèn)的讀寫(xiě)特性
    3.setter = aa: 
告訴編譯器,當(dāng)自動(dòng)生成setter方法時(shí),setter方法名為指定的名字aa:不采用默認(rèn)
    4.getter = bb: 
告訴編譯器,當(dāng)自動(dòng)生成getter方法時(shí),getter方法名為指定的名字bb:不采用默認(rèn)

2.原子性特性 nonatomic  atomic
   1.atomic:
原子特性 保證線程安全,內(nèi)部做了安全處理(加鎖和解鎖)
   2.nonatomic:
非原子特性,不保證線程安全
 
因?yàn)閷?duì)于settergetter方法的使用,比較頻繁的在一段時(shí)間內(nèi)要多次訪問(wèn),降低程序的執(zhí)行效率,使用nonatomic雖然不保證線程的安全,但使用一般情況下是安全的,所以對(duì)于原子特性使用nonatomic
3.
語(yǔ)義特性
   1.assign :
直接賦值 使用針對(duì)于基本數(shù)據(jù)類(lèi)型,也可針對(duì)于對(duì)象類(lèi)型.系統(tǒng)默認(rèn)的語(yǔ)義特性.
   2.copy:
針對(duì)對(duì)象類(lèi)型,而且要服從NSCopying協(xié)議的類(lèi)型的對(duì)象才可以.恢復(fù)至出一個(gè)新的對(duì)象,擁有新的對(duì)象的所有權(quán)(引用計(jì)數(shù)+1)
   3.retain :
針對(duì)于對(duì)象類(lèi)性(NSString,NSArray),會(huì)造成對(duì)象引用計(jì)數(shù)+1.


29.屬性的實(shí)現(xiàn)  

聲明部分:

@property(nonatomic,retainNSString *name; 

@property(nonatomicretainNSString *gender;

@property(nonatomicassignNSInteger age;

@property(nonatomicassignCGFloat height;綠色部分可省略 默認(rèn)可省

@property(nonatomic,assignCGFloat weight;

實(shí)現(xiàn)部分:

@synthesize屬性自動(dòng)生成settergetter方法的實(shí)現(xiàn)部分 name 屬性名,指定要實(shí)現(xiàn)哪一個(gè)屬性生成settergetter方法 _name ,指定settergetter方法的內(nèi)部實(shí)現(xiàn)要操作的實(shí)例變量
如果指定的實(shí)例變量沒(méi)有定義,系統(tǒng)會(huì)自動(dòng)生成,但是生成的實(shí)例變量是私有的,子類(lèi)不能訪問(wèn).
如果實(shí)例變量想讓子類(lèi)使用訪問(wèn),那在.h文件必須定義實(shí)例變量
如果未指定settergetter內(nèi)部所要訪問(wèn)的實(shí)例方法時(shí),系統(tǒng)會(huì)自動(dòng)生成和屬性名一樣的實(shí)例變量
如果對(duì)于settergetter方法我們一旦實(shí)現(xiàn)以后,系統(tǒng)就不會(huì)自動(dòng)生成.
@synthesize name = _name,gender = _gender ,age = _age ,height = _height,weight = _weight;//附上要實(shí)現(xiàn)的實(shí)例變量
如果在.m文件中未通過(guò)@synthesize對(duì)屬性進(jìn)行合成,系統(tǒng)會(huì)自動(dòng)合成,只不過(guò)系統(tǒng)默認(rèn)的settergetter方法是: _屬性名
如果將@synthesize省略,并且我們自己實(shí)現(xiàn)setter以及getter方法時(shí),系統(tǒng)就不會(huì)自動(dòng)生成對(duì)應(yīng)的settergetter,還有實(shí)例變量.
1.當(dāng)把語(yǔ)義特性聲明為assign時(shí),settergetter的內(nèi)部實(shí)現(xiàn).同系統(tǒng)寫(xiě)的settergetter方法
- (void)setName:(NSString *)name{
    _name = name;
}
- (NSString *)name{
    return _name;
}

注意:二和三基本一樣 不同部分為洋紅色部分

2.當(dāng)把語(yǔ)義特性聲明為retain時(shí),settergetter的內(nèi)部實(shí)現(xiàn).
- (void)setName:(NSString *)name{
    if(_name != name){
        [_name release];
        _name = [name 
retain];
    }
}
- (NSString *)name{
    return [[_name retain] autorelease];
}

3.當(dāng)把語(yǔ)義特性聲明為copy時(shí),settergetter的內(nèi)部實(shí)現(xiàn).
- (void)setName:(NSString *)name{
    if(_name != name){
        [_name release];
        _name = [name 
copy];
    }
}
- (NSString *)name{
    return [[_name retain] autorelease];
}


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI