1、category:分类
在java中,如果想要扩展某一个类的,最直接的方法就是采用继承的方式,但是,继承有个最大的弊端就是耦合度实在是太高,在大型项目中,写到后面都有种想死的心都有,只要父类改变了一点点功能,就得去检查是否会影响到子类。所以在实际开发中尽量少用继承这种方式,一般会采用装饰等其他方式来避开继承。
object-c中,设计出了category这个机制,对于扩展类的功能来说,比起继承来说,也算是一个较大的改进了。
2、block
一种数据类型,类似于匿名函数或是javascript中的闭包吧
//
// Calculate.h
// IOS_Study_Sample
//
// Created by luozheng on 2018/1/26.
// Copyright © 2018年 luozheng. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Calculate : NSObject
typedef int (^calculateBlock) (int,int);
-(int)calculate:(int)num1 num2:(int)num2 block:(calculateBlock)cal;
@end
//
// Calculate.m
// IOS_Study_Sample
//
// Created by luozheng on 2018/1/26.
// Copyright © 2018年 luozheng. All rights reserved.
//
#import "Calculate.h"
@implementation Calculate
-(int)calculate:(int)num1 num2:(int)num2 block:(calculateBlock)cal
{
return cal(num1,num2);
}
@end
//
// main.m
// 04-block测试
//
// Created by luozheng on 2018/1/26.
// Copyright © 2018年 luozheng. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Calculate.h"
NSString* hello(int i)
{
//NSLog(@"hello 999999999999999");
return [NSString stringWithFormat:@"hello 999999999999999 %d",i];
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// myHello是一个指向函数的指针,最前面是返回值,注意返回值不要使用括号
NSString* (*myHello)(int) = hello;
NSString* result = myHello(100);
NSLog(@"result = %@",result);
// block类似于函数指针,唯一的不同就是函数不用在外面单独写了
NSString* (^myBlock) (int) = ^ NSString* (int i) {
return [NSString stringWithFormat:@"hello 666666666666 %d",i];
};
NSString* blockResult = myBlock(888);
NSLog(@"blockResult = %@",blockResult);
// block作为参数传给方法
int (^sumBlcok)(int,int) = ^ int (int num1,int num2){
return num1 + num2;
};
Calculate *calculate = [[Calculate alloc] init];
int sum = [calculate calculate:20 num2:68 block:sumBlcok];
NSLog(@"sum result = %d",sum);
}
return 0;
}
3、protocol:协议,这个直接理解成interface就行。
4、SEL 数据类型:指向方法的一个指针
没有啥可多说的,有个问题看看原因和处理方法就行。
performSelector may cause a leak because its selector is unknown
//
// main.m
// 05-protocol测试
//
// Created by luozheng on 2018/1/26.
// Copyright © 2018年 luozheng. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Button.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Button<ViewNameProtocol,ViewLifecycleProtocol> * button = [[Button alloc] init];
// [button onCreate];
// NSLog(@"Button name = %@",[button name]);
// [button onDestroy];
SEL s1 = @selector(onCreate);
[button performSelector:@selector(onCreate)];
[button performSelector:NSSelectorFromString(@"onCreate")];
}
return 0;
}
网友评论