标签:style blog io color ar 使用 sp for strong
一: 分类(Category)
#import "Person.h" @interface Person : NSObject - (void)sayHi; @end @implementation Person - (void)sayHi { NSLog(@"sayHi----------"); } @end
Person类的分类方法
#import "Person+study.h" @interface Person (study) - (void)study; @end @implementation Person (study) - (void)study { NSLog(@"study-------"); } @end
@interface NSString (NSStringWithNum) - (int)numOfString:(NSString *)string; @end @implementation NSString (NSStringWithNum) - (int)numOfString:(NSString *)string { int num = 0; for (int i = 0; i<string.length; i++) { char ch = [string characterAtIndex:i]; if (ch>‘0‘&&ch<‘9‘) { num++; } } return num; } @end
Main函数
#import <Foundation/Foundation.h> #import "Person.h" #import "Person+study.h" #import "NSString+NSStringWithNum.h" int main(int argc, const char * argv[]) { @autoreleasepool { // Person *p =[[Person alloc] init]; // [p sayHi]; // [p study]; NSString *string = @"hello123word456"; NSLog(@"%d",[string numOfString:string]); } return 0; }
#import "Person.h" @interface Person () @property (nonatomic, copy) NSString *name; - (void)sayHi; @end @implementation Person - (void)sayHi { NSLog(@"sayHi-----------"); } @end
#import <Foundation/Foundation.h> void gotoWork(void(^myBlock)()) { NSLog(@"-----------"); NSLog(@"????????????"); NSLog(@",,,,,,,,,,"); myBlock(); NSLog(@"99999999999"); NSLog(@"2222222222"); } typedef int (^sumBlock)(int, int); int main(int argc, const char * argv[]) { // 按道理说我们在ARC中创建对象的代码必须写在释放池中,因为编译器会将代码加到释放池中 @autoreleasepool { // 用法一:无参无返回值 // void (^myBlock)() = ^{ // NSLog(@"myBlock--------"); // }; // myBlock(); // 用法二:有参有返回值 // int (^sumBlock)(int, int) = ^(int n, int m){ // // return n+m; // }; // NSLog(@"%d", sumBlock(3,4)); // 用法三:自定义类型Block使用 // sumBlock sumblock = ^(int n, int m){ // return n+m; // }; // NSLog(@"%d", sumblock(3,4)); // 用法四:访问block代码块外的成员变量,修改block代码块外的成员变量 // __block int num = 9; // void (^myBlock)() = ^{ // num++; // NSLog(@"%d", num); // 错误,可以访问代码块外的成员变量,因为该成员变量对于代码块 // // 来说是一个全局变量,内部可以访问,但是不能修改,如果想修改的话 // // 可以用(__block)来修饰该成员变量值 // }; // myBlock(); // 用法五:Block作为函数的参数使用 // gotoWork(^{ // // NSLog(@"hello"); // }); // 注意:我们在以后的学习中,Block数据类型经常要作为参数或者任务封装到Block数据类型中 } return 0; }
1)Block内部可以访问外部变量;
2)默认情况下,Block内部不能修改外部的局部变量
3)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
(1)概念
1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量), 不能写实现。
2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
3.只要父类遵守了某个协议,那么子类也遵守。
4.Protocol声明的方法可以让任何类去实现,protocol就是协议。
5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
8协议方法声明中的关键字
(1)required (默认)要求实现,若没有实现则警告但不报错
(2)Optional 不要求实现
2>用法:
经常用在代理方法中,只要某个类遵守一个协议,就可以作为另一个类的代理为该类做事情
基本用法:
baby头文件
#import <Foundation/Foundation.h> #import "BabyProtocol.h" @class Nurse; @interface Baby : NSObject @property (nonatomic, strong) id<BabyProtocol> delegate; @property (nonatomic, assign) int age; - (void)cry; - (void)hungry; @end
baby类的.m文件
#import "Baby.h" @implementation Baby - (void)cry { NSLog(@"%d岁的Baby哭了", self.age); [self.delegate noCry:self]; } - (void)hungry { NSLog(@"%d岁的Baby饿了", self.age); [self.delegate feed:self]; } @end
Nurse头文件
#import <Foundation/Foundation.h> #import "BabyProtocol.h" @interface Nurse : NSObject <BabyProtocol> @end
Nurse类的.m文件
#import "Nurse.h" @implementation Nurse - (void)noCry:(Baby *)baby { NSLog(@"护士哄Baby不要哭"); } - (void)feed:(Baby *)baby { NSLog(@"护士喂Baby吃东西"); } @end
协议头文件
#import <Foundation/Foundation.h> @class Baby; @protocol BabyProtocol <NSObject> - (void)noCry:(Baby *)baby; - (void)feed:(Baby *)baby; @end
Main函数
#import <Foundation/Foundation.h> #import "Baby.h" #import "Nurse.h" int main(int argc, const char * argv[]) { @autoreleasepool { Baby *baby = [[Baby alloc] init]; Nurse *nurse = [[Nurse alloc] init]; baby.delegate = nurse; baby.age = 3; [baby cry]; [baby hungry]; } return 0; }
3> 注意:
协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。
OC中分类、类扩展、Block、协议(由协议引出的代理模式)
标签:style blog io color ar 使用 sp for strong
原文地址:http://www.cnblogs.com/-boy/p/4088253.html