亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

objective-c語法快速過(8)

2019-11-14 19:30:22
字體:
來源:轉載
供稿:網友

Block(oc 的數據類型,很常用,本質是c結構體)

類似內聯函數,從源代碼層看,有函數的結構,而在編譯后,卻不具備函數的性質。編譯時,類似宏替換,使用函數體替換調用處的函數名

Block封裝了一段代碼,可以在任何時候執行

Block可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值。

蘋果官方建議盡量多用block。在多線程、異步任務、集合遍歷、集合排序、動畫轉場用的很多

Blocks的定義:

int (^MySum)(int, int) = ^(int a, int b) {     return a+b;};

定義了一個叫MySum的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,Block可以訪問局部變量,但是不能修改。

Block 類似一個語句,比如10;

int sum = 10;int (^MyBlock)(int) = ^(int num) {    sum++;//編譯報錯    return num * sum;};

如果要修改就要加關鍵字:__block

__block int sum = 10;

能訪問全局變量且也能修改全局變量

Blocks和函數指針對比(類似)

定義函數指針

int (*myFn)();

定義Blocks

int (^MyBlocks)(int,int);

調用函數指針

(*myFn)(10, 20);

調用Blocks

MyBlocks(10, 20);

Blocks的賦值

在聲明的同時定義變量,然后賦值

int (^MySum)(int,int) = ^(int a,int b) {     return a + b;};

也可先用typedef先聲明類型,再定義變量進行賦值

typedef int (^MySum)(int,int);MySum sum = ^(int a,int b) {     return a + b;}; 

block要掌握的東西
1> 如何定義block變量(兩種)

int (^sumBlock)(int, int);void (^myBlock)();

2> 如何利用block封裝代碼

^(int a, int b) {return a - b;};^() {NSLog(@"----------");};

3> block訪問外面變量

* block內部可以訪問外面的變量
* 默認情況下,block內部不能修改外面的局部變量
* 給局部變量加上__block關鍵字,這個局部變量就可以在block內部修改

4> 利用typedef定義block類型

typedef int (^MyBlock)(int, int);// 以后就可以利用MyBlock來定義block變量MyBlock block;MyBlock b1, b2;b1 = ^(int a, int b) {return a - b;};MyBlock b3 = ^(int a, int b) {return a - b;};

PRotocol簡單使用(很常見)

基本用途

用來聲明一大堆方法(不能聲明成員變量),僅僅是聲明!

只要某個類遵守了這個協議,就相當于擁有這個協議中的所有方法聲明

只要父類遵守了某個協議,就相當于子類也遵守了

協議的編寫

@protocol 協議名稱// 方法聲明列表@end

某個類遵守協議

@interface 類名 : 父類 <協議名稱>@end

協議中有2個關鍵字可以控制方法是否要實現(默認是@required),在大多數情況下,用途在于程序員之間的交流

  • @required:這個方法必須要實現(若不實現,編譯器會發出警告)
  • @optional:這個方法不一定要實現

協議遵守協議

  • 一個協議可以遵守其他多個協議,多個協議之間用逗號 , 隔開
  • 一個協議遵守了其他協議,就相當于擁有了其他協議中的方法聲明
@protocol 協議名稱 <協議1, 協議2>@end

基協議

  • NSObject是一個基類,最根本最基本的類,任何其他類最終都要繼承它
  • 其實還有一個協議,名字也叫NSObject,它是一個基協議,最根本最基本的協議
  • NSObject協議中聲明很多最基本的方法,比如description、retain、release等
  • 建議每個新的協議都要遵守NSObject協議

定義變量時指定協議

// NSObject類型的對象,并且要遵守NSCopying協議NSObject<NSCopying> *obj;// 任何OC對象,并且要遵守NSCoding協議id<NSCoding> obj2;

在 xcode6里新建協議的方法:oc file 里如下類似窗口(包括新建分類也是如此)

建立.h 文件,因為協議就是用來聲明方法的。頭文件里聲明即可。

//  MyProtocol.h#import <Foundation/Foundation.h>// 定義了一個名叫MyProtocol的協議@protocol MyProtocol <NSObject>// @required 要求實現,不實現就會發出警告// @optional 不要求實現- (void)test4;@required- (void)test;- (void)test2;@optional- (void)test3;@end//  MyProtocol2.h#import <Foundation/Foundation.h>@protocol MyProtocol2  <NSObject>- (void)haha2;@optional- (void)haha3;@end//  MyPrototol3.h#import <Foundation/Foundation.h>#import "MyProtocol.h"// 一個協議遵守了另外一個協議,就可以擁有另一個協議的所有方法聲明@protocol MyProtocol3 <MyProtocol>- (void)hehe;@end/*文件名:Person.h */#import <Foundation/Foundation.h>@class Hashiqi;@protocol MyProtocol2;@protocol MyProtocol3;// 只要一個類遵守了某一份協議,就能擁有這份協議中的所有方法聲明// : 繼承// <> 遵守協議@interface Person : NSObject <MyProtocol3, MyProtocol2>@property (nonatomic, strong) id<MyProtocol2> obj;@property (nonatomic, strong) Hashiqi *dog;@end/*文件名:Person.m*/#import "Person.h"#import "MyProtocol2.h"#import "MyProtocol3.h"@implementation Person- (void)test{}@end//  MyProtocol4.h#import <Foundation/Foundation.h>@protocol MyProtocol4 <NSObject>@end/*文件名:Dog.h */#import <Foundation/Foundation.h>@protocol MyProtocol2;@interface Dog : NSObject <MyProtocol2>@end/*文件名:Dog.m*/#import "Dog.h"#import "MyProtocol2.h"@implementation Dog- (void)haha2{}@end/*文件名:Hashiqi.h */#import "Dog.h"@protocol MyDogProtocol <NSObject>- (void)dogTest;@end@interface Hashiqi : Dog<MyDogProtocol>- (void)addTest;@end@interface Hashiqi (Add)- (void)addTest;@end/*文件名:Hashiqi.m */#import "Hashiqi.h"@implementation Hashiqi- (void)dogTest{}@end@implementation Hashiqi (Add)- (void)addTest{}@end//  Hashiqi+MJ.h#import "Hashiqi.h"@interface Hashiqi (MJ)@end//  Hashiqi+MJ.m#import "Hashiqi+MJ.h"@implementation Hashiqi (MJ)@end//  main.m#import <Foundation/Foundation.h>#import "MyProtocol.h"#import "MyProtocol3.h"#import "Person.h"#import "Dog.h"#import "Hashiqi.h"int main(){    Person *p = [[Person alloc] init];    p.obj = [[Hashiqi alloc] init];        return 0;}void test(){    //NSObject *obj = [[NSObject alloc] init];            //NSObject *obj2 = @"4324324";            // 要求obj3保存的對象必須是遵守是MyProtocol這個協議        //NSObject<MyProtocol> *obj3 = [[NSObject alloc] init];        NSObject<MyProtocol> *obj3 = [[Person alloc] init];        obj3 = nil;        //id 相當于 NSObject *    id<MyProtocol> obj4 = [[Person alloc] init];        obj4 = nil;        // 要求obj5,保存的對象必須遵守MyProtocol3、并且繼承了Person    Person<MyProtocol3> *obj5 = [[Person alloc] init];        obj5 = nil;}

協議的定義
@protocol 協議名稱 <NSObject>
// 方法聲明列表....
@end

如何遵守協議
1> 類遵守協議
@interface 類名 : 父類名 <協議名稱1, 協議名稱2>
@end

2> 協議遵守協議
@protocol 協議名稱 <其他協議名稱1, 其他協議名稱2>
@end

3.協議中方法聲明的關鍵字
1> @required (默認)
要求實現,如果沒有實現,會發出警告

2> @optional
不要求實現,不會有警告

4.定義一個變量的時候,限制這個變量保存的對象遵守某個協議
類名<協議名稱> *變量名;
id<協議名稱> 變量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;

如果沒有遵守對應的協議,編譯器會警告

5.@property中聲明的屬性也可用做一個遵守協議的限制
@property (nonatomic, strong) 類名<協議名稱> *屬性名;
@property (nonatomic, strong) id<協議名稱> 屬性名;

@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;

6.協議可用定義在單獨.h文件中,也可用定義在某個類中
1> 如果這個協議只用在某個類中,應該把協議定義在該類中

2> 如果這個協議用在很多類中,就應該定義在單獨文件中

7.分類可用定義在單獨.h和.m文件中,也可用定義在原來類中
1> 一般情況下,都是定義在單獨文件
2> 定義在原來類中的分類,只要求能看懂語法


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲无av在线中文字幕| 日韩大片免费观看视频播放| 国产精品尤物福利片在线观看| 国产中文字幕亚洲| 欧美成人免费在线观看| 久久久久久999| 日韩在线观看免费全| 成人天堂噜噜噜| 久久五月情影视| 在线不卡国产精品| 亚洲国产高清高潮精品美女| 亚洲一区久久久| 亚洲人成电影网站色www| 精品福利在线看| 日韩电影中文字幕| 成人黄色短视频在线观看| 午夜美女久久久久爽久久| 欧美日韩999| 久久激情视频免费观看| 成人97在线观看视频| 国产大片精品免费永久看nba| 成人日韩av在线| 国产精品久久一区| 亚洲情综合五月天| 色爱精品视频一区| 一区二区欧美在线| 色婷婷综合久久久久| 欧美日韩裸体免费视频| 国产精品香蕉在线观看| 亚洲精品乱码久久久久久按摩观| 国产精品96久久久久久| 亚洲精品少妇网址| 亚洲欧洲激情在线| 91精品免费视频| 高清欧美性猛交xxxx| 久久免费视频网站| 国产福利视频一区| 欧美日韩成人在线视频| 亚洲va欧美va在线观看| 97国产精品免费视频| 在线观看日韩专区| 久久精彩免费视频| 欧美一区亚洲一区| 欧美有码在线观看| 久久不射电影网| 亚洲美女视频网站| 国产一区二区美女视频| 欧美国产日韩免费| 精品女厕一区二区三区| 91丝袜美腿美女视频网站| 成人免费视频a| 亚洲国产日韩精品在线| 久久久国产精彩视频美女艺术照福利| 国产有码在线一区二区视频| 97精品伊人久久久大香线蕉| 亚洲精品一区二区网址| 亚洲最大激情中文字幕| 国产精品亚洲综合天堂夜夜| 中国china体内裑精亚洲片| 亚洲高清福利视频| 亚洲欧美日韩一区二区三区在线| 日韩视频一区在线| 91久热免费在线视频| 亚洲在线免费看| 永久555www成人免费| 欧美日韩中文字幕在线视频| 国产精品av在线| 日韩av在线影院| 亚洲女人被黑人巨大进入| 国产欧美一区二区三区视频| 欧美一级bbbbb性bbbb喷潮片| 亚州精品天堂中文字幕| 国产不卡av在线免费观看| 亚洲国产精品免费| 91精品视频专区| 欧美电影免费观看高清| 欧美高清不卡在线| 亚洲一区二区三区四区在线播放| 欧美成人国产va精品日本一级| 国产91露脸中文字幕在线| 久久精品中文字幕电影| 欧美激情视频播放| 成人激情视频在线观看| 亚洲精品欧美日韩专区| 国产亚洲精品va在线观看| 久久99精品久久久久久琪琪| 欧美视频在线免费| 美女福利精品视频| 亚洲午夜av电影| 中文一区二区视频| 亚洲精品国产成人| 亚洲欧美日韩在线高清直播| 91久久久精品| 久久久亚洲欧洲日产国码aⅴ| 懂色aⅴ精品一区二区三区蜜月| 亚洲免费视频一区二区| 国产精彩精品视频| 久久久久国产精品免费网站| 日本精品久久久久影院| 亚洲a级在线观看| 成人写真视频福利网| 精品成人av一区| 久久人人爽亚洲精品天堂| 日韩中文字幕精品视频| 国产亚洲精品久久久久久777| 欧美黑人一区二区三区| 久久99热精品这里久久精品| 国产精品久久久久一区二区| 欧美日韩国产丝袜美女| 亚洲欧美日韩成人| 国产精品精品视频一区二区三区| 欧美激情免费视频| 91国内免费在线视频| 久久偷看各类女兵18女厕嘘嘘| 欧美高清理论片| 亚洲人免费视频| 国产丝袜一区二区三区免费视频| 伊人青青综合网站| 国产精品一区二区三区成人| 不卡中文字幕av| 亚洲一区二区三区久久| 欧美精品久久一区二区| 国产成人精品网站| 国模吧一区二区三区| 91日本在线观看| 久久久久久久一区二区三区| 日韩国产精品视频| 国产日韩精品在线观看| 麻豆乱码国产一区二区三区| 欧美国产一区二区三区| 色香阁99久久精品久久久| 国产成人精品亚洲精品| 久久久成人精品| 久久久久久久久国产| 日韩中文在线观看| 2019国产精品自在线拍国产不卡| 国产视频观看一区| 国产综合色香蕉精品| 色综合视频网站| 国产精品小说在线| 高潮白浆女日韩av免费看| 91精品国产91久久久久久吃药| 亚洲女人天堂色在线7777| 精品视频久久久久久久| 伊人激情综合网| 国产亚洲欧美日韩精品| 国产精品久久久久久久久| 8x海外华人永久免费日韩内陆视频| 91精品国产色综合久久不卡98| 亚洲九九九在线观看| 国产欧美一区二区三区四区| 精品欧美一区二区三区| 欧美日本在线视频中文字字幕| 国产亚洲精品久久久优势| 久久天天躁夜夜躁狠狠躁2022| 久久人体大胆视频| 日本精品免费一区二区三区| 国产69久久精品成人看| 欧美激情精品久久久久久久变态| 成人亲热视频网站| 日本午夜在线亚洲.国产| 国产精品久久久久久久久久久久| 亚洲欧洲日产国码av系列天堂| 91在线播放国产|