【iOS系列】-oc中特有的语法

【iOS系列】-oc中特有的语法

oc数据类型:

 1,基本类型     
 2,对象类型
 3,id
 4,BOOL
 5,block
 6,SEL 

1:category

使用继承关系来扩充一个类,有一个弊病,高耦合性

category(分类,类别)
能够帮我们扩充一个类的功能

1,只要是在原类中生成的成员变量都可以在分类中直接访问,不能在分类中生成员变量

2,如果分类中定义实现了与原类中相同的方法,那么原类中的方法相当于被覆盖掉了。
注:在实际的开发中,最好不要出现方法覆盖

//指向函数的指针
void test()
{
    NSLog(@"test");
}
 void (*myTest)() = test;
 myTest();

2:block 指向函数的指针比较像

block就是弥补了 指向函数的指针,不能够直接保存一个函数体(代码块)

//定义(无返回值)
 void (^myBlock)() = ^{
            NSLog(@"test");
  };
//调用
 myBlock();


//定义(有返回值)
 int (^sumBlock)(int a, int b) = ^int (int a, int b) {
       
            return a + b;
  };
  //调用   
  int result = sumBlock(10,20);

注:如果想要改变,block代码块之外的变量值,就必须在变量前加入 __block关键字

3:protocol(协议)

意思同:java中的接口

1,谁遵循协议,谁就要实现协议中定义的方法
2,协议文件本身只是提供方法的声明,并不实现方法
3,协议本身也可以遵循其他协议,NSObject是一个基础协议,协议也可以同时遵循多个其他协议
4,父类遵循了那些协议,子类同样遵循那些协议
5,一个类可以同时遵循多个协议

@required//下面的方法,必须实现,默认都是必须实现的
@optional //下面的方法,可选实现

4:SEL:包装方法

- (void)test1;
- (void)test2:(NSString *)n;
- (NSString *)test3;

		    
//无参数
[t test1];
//使用@selector就能够把一个方法包装成 SEL数据类型
SEL s1 = @selector(test1);
//包装后的方法的执行
[p performSelector:s1];
//或者这样调用,更为常用一些
[p performSelector:@selector(test1)];



//带参数
SEL s2 = @selector(test2:);
 
[p performSelector:s2 withObject:@"135047654"];

//带返回值
SEL s3 = @selector(test3);
 
NSString * str = [p performSelector:s3];
原文地址:https://www.cnblogs.com/fengtengfei/p/4312034.html