麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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> 定義在原來類中的分類,只要求能看懂語法


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄色va视频 | caoporn国产一区二区 | 欧美激情 在线播放 | 香蕉久久久久久 | 国产成人自拍小视频 | 国内精品免费一区二区2001 | 成品片a免人视频 | 国产一级淫片在线观看 | 美女在线观看视频一区二区 | 亚洲白嫩在线观看 | 成人免费视频视频在线观看 免费 | 女女久久| 免费一级在线观看 | 91福利在线观看 | 国产乱淫av | 蜜桃视频在线播放 | 牛牛a级毛片在线播放 | 91久久在线观看 | 日韩视频在线一区二区三区 | 久久久久久久久久美女 | 免费黄色小网站 | 日本一区二区久久久 | 本站只有精品 | 成人做爰s片免费看网站 | 一级做人爱c黑人影片 | 一区二区三区日本在线观看 | av在线免费观看播放 | 青草久久久久 | 奶子吧naiziba.cc免费午夜片在线观看 | 久久久久久久久久久亚洲 | 精品成人在线观看 | 免费专区 - 91爱爱 | 亚洲成人免费网站 | 龙床上的呻吟高h | 久久久精品视频国产 | 久久精品亚洲欧美日韩精品中文字幕 | 成人福利免费在线观看 | 美女在线观看视频一区二区 | 蜜桃视频最新网址 | 三人弄娇妻高潮3p视频 | av中文字幕免费在线观看 |