OC---特有语法2

特有语法2


-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!----------------------------

一、 分类-Category

1. 基本用途

  如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式

    继承

   分类(Category)

2.格式
   分类的声明

  @interface 类名 (分类名称)

  // 方法声明

  @end

   分类的实现

  @implementation 类名 (分类名称)

  // 方法实现

  @end

3.好处
  一个庞大的类可以分模块开发
  一个庞大的类可以由多个人来编写,更有利于团队合作
4.给系统自带的类添加分类
  给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
  给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数
5.注意
  Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。
  Category可以实现原始类的方法,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法
  多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
二,类的补充
1.类也是个对象
  其实类也是一个对象,是Class类型的对象,简称“类对象”
  Class类型的定义:

     typedef struct objc_class *Class;

  类名就代表着类对象,每个类只有一个类对象,就是他本身
2.+load和+initialize
  +load-在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法
  先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load
  先加载元原始类,再加载分类
  不管程序运行过程有没有用到这个类,都会调用+load加载
  +initialize-在第一次使用某个类时,就会调用一次+initialize方法
  一个类只会调用一次+initialize方法,先调用父类的,再调用子类的
3.获取类对象的2种方式
    Class c = [Person class];  类方法
    Person *p = [Person new];
    Class *c1 = [p class];  对象方法  
4.类对象调用方法

  Class c = [Person class];

  Person *p2 = [c new];

三.descrip
1.-description方法
  使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出
2.+ description方法
  使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出
3,修改NSLog的默认输出
  重写-description或者+description方法即可
4.死循环陷阱
  如果在-description方法中使用NSLog打印self
四、SEL
1.方法的存储位置
  每个类的方法列表都存储在类对象中
  每个方法都有一个与之对应的SEL类型的对象
  根据一个SEL对象就可以找到方法的地址,进而调用方法
  SEL类型的定义:
   typedef struct objc_selector *SEL;
2.SEL对象的创建
   SEL s = @selector(test);

      SEL s2 = NSSelectorFromString(@"test");

3.SEL对象的其他用法
  NSString *str = NSStringFromSelector(@selector(test));// 将SEL对象转为NSString对象
  Person *p = [Person new];
  [p performSelector:@selector(test)]; // 调用对象p的test方法
五.NSLog输出增强
   __FILE__ :源代码文件名
   __LINE__ :NSLog代码在第几行
   
_cmd :代表着当前方法的SEL

六.protocol

  1.用途:

   可以用来声明一大堆方法(不能声明成员变量)

   只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

   只要父类遵守了某个协议,就相当于子类也遵守了

  2.格式

   协议的编写

   @protocol 协议名称

   @end

   某个类遵守协议

   @interface 类名 : 父类 <协议名称>

   @end

  3.关键字

   协议中有2个关键字可以控制方法是否要实现(默认是@required)

   @required:这个方法必须要实现

   @optional:这个方法不一定要实现

  4.协议遵守协议

   一个协议可以遵守其他多个协议,多个协议之间用逗号 隔开

   一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

   @protocol 协议名称 <协议1, 协议2>

   @end

  5.基协议

   NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它

   其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议

   NSObject协议中声明很多最基本的方法如:descriptionretainrelease....

七.Block

   1.用处

   Block封装了一段代码,可以在任何时候执行
   Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
   2.定义

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

   定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
   Block可以访问局部变量,但是不能修改。
   int sum = 10;
   int (^MyBlock)(int) = ^(int num) {
sum++;//编译报错
return num * sum;
   };
    如果要修改就要加关键字:__block
   __block int sum = 10;

   3.block的赋值

    在声明的同时定义变量,然后赋值
    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;
    }; 

八.ARC

  1.基本简介

  ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的         retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切

  ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管   理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化

  2.基本原理

  ARC 的规则:只要还有一个强指针变量指向对象,对象就会保持在内存中

  3.使用注意

   不能调用releaseretainautoreleaseretainCount

   可以重写dealloc,但是不能调用[super dealloc]

    @property : 想长期拥有某个对象,应该用strong,其他对象用weak

    其他基本数据类型依然用assign

    两端互相引用时,一端用strong、一端用weak


-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!----------------------------
















































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值