OC基础笔记4

来源:互联网 发布:云舒网络 拖欠工资 编辑:程序博客网 时间:2024/05/16 15:16
75,autorelease释放池在销毁时,只是对每个发送了autorelease的对象进行一次release操作,如果对象的计数值仍不为零,也是无法释放的。autorelease方法返回对象本身,不修改计数器,不用担心什么时候需要调release。释放池类似栈的结构存在(先进先出)。
还有一种写法是创建一个NSAutoreleasePool对象,最后调用release释放这整个池子。
76,只要在释放池中调autorelease,就可以将对象放入释放池。不一定要在释放池里创建对象。
77,释放池不适合放内存很大的对象或者大量循环,因为池中的东西相当于缓存,内存峰值不宜太高。释放池可以在任意地方创建,特别是创建和释放次数多的,可以分次进行。释放池是可以嵌套多个的。调用n次autorelease就相当于释放池释放后调用n次release来释放调用者。
(在调试窗口中,当前占用内存值在Memory显示。)
78,当每一个对象都要调用一次autorelease时,可以尝试前面学的构造方法或类工厂方法,简化代码。
79,在foundation框架的类,通过类工厂方法创建的对象,都是调用过autorelease的。为什么?

80,ARC,编译器特性,也就是xcode的功能,由xcode帮忙写了那些release等内存管理的词语。 但不是根据引用计数器来释放的,没有强指针指向的对象,才进行释放。默认情况大家都是强指针,而指针是放在栈中的,属于局部变量(程序结束会自动销毁)。
81,对象还存在,弱指针才有用,如果对象被释放了,弱指针也会没用同时变为nil。在preproty的属性是strong表示强指针,弱指针就是weak。assign是专用在基本数据类型的,不参与内存管理。

82,分类category,在不修饰原来类的基础上扩充(只能扩充)方法,一个庞大的类因此得以分类完成,每个小分类可以由不同的人来编写。是oc特有的语法。同样有.m和.h文件,类似子类的写法。名称以原有类为基础+分类名。分类中的@property只用于声明setget方法,无实现和生成实例,分类只会使用原类.h中的公有实例。分类可以重写原类的方法,也是优先级的,不过尽量不要这么用,因为多个分类重写方法,编译器只会按照最新建的分类来执行 。

83,匿名分类,也就是类扩展,只写着要扩展的类的.m文件中,用于扩展私有的变量和方法。直接在原类的@implementation的上面,写一段私有的@interface{    }作为类扩展。补充:写在@implementation下面的私有属性。
84,匿名分类可以扩展匿名的属性和方法声明,而分类不行。也称为类扩展。在.m文件中添加@interface 类名 (),不能使用在不可以修改文件的类
85,记住char类型接受的是字符的asll码值,遍历字符串的每个字符并找出阿拉伯数字的个数:
86,无论什么类,都能添加分类,最常用的是为foundation框架中的类添加分类。 
87,block,是一种特殊的数据类型(可做形参可做返回值),应用广泛。用于保存某一段代码,在适当的时候取出来调用,类似于函数和方法。
定义格式:返回值类型(^block变量名)(形参)=^(形参){    };
88,补充(*roseP)是指向函数的指针。
89,^(形参){    };才是block代码,而返回值类型(^block变量名)(形参)是用来保存block代码的block变量。学习ui后就知道block的好处。
90,typedef在预设类型名称时,函数指针是特殊的,可以直接用函数名称代替整个函数。new部分不用写新的名字。而block和函数指针一样也可以用这种方法去简化
91,block也可以作为参数,将一段代码带入函数中。用在多个函数类似的情况下,抽取部分不同内容的做代码块,需要的时候直接带入
92,block中可以“访问”定义中以外的变量,可以定义一个外面已经拥有的同名变量(局部变量)。block定义中的东西,虽然有些和外面的同名,但并不是同一个东西。当代码块处于堆中,访问定义以外的对象时,指向其地址进行访问。
93,默认情况,不可以在block中修改外界变量的值,因为它是复制进block中的。除非外界那个变量的类型是_block,就可以在内部通过指针来修改变量值了
block本质就是包含一个结构体和一个指针的,外界的内容只能通过指针进入到结构体。
94,xcode中的一些指令,在终端写cc --help,就可以看到
95,协议protocol是由方法的声明组成的,只有.h文件中用于编写方法声明。遵守协议者都必须按规定实现里面声明的方法?继承一个类,也会继承这个类所遵循的方法。
@protocol 协议名称 <基协议:NSObject >
 协议内容/方法声明
@end
96,一个类可以遵循一个或多个协议,协议创建和分类创建方式一样,但子类继承父类时,会同时继续他的协议(声明),那么方法还是要重写的,否则就会调用到父类中的实现。协议也是可以遵守其他协议(类似继承)。     
 97,协议的关键字,@required必须实现,默认的,@optional选择性实现。但并不能严格控制实现与否,即使没有实现必须实现的方法,也只是警告而已。将协议写在数据类型的右边,可以用来标明其遵守了哪一个协议。person *p=[ person new ];这些标记,都是用于程序员的沟通
98,可以用协议做一个代理设计模式(模板),代理,就是代替做某事,而代理,可以有很多个,每一个都遵循一个固定的模式就可以了,这个固定模式,就是创建一个协议,有代理应该拥有的功能,代理都遵循这个协议。
99,如果这个协议只属某个类或他的属性,可以直接写在他上面,标准写法如下(ui标准)
还可以区别开不同的遵守协议者。
100,当一个文件只需要遵循另一个文件的协议时,也可以声明一下协议,在.m文件中再import那个文件,就像之前@class一样的方式,不必整个import在.h文件,减少耦合性。
0 0
原创粉丝点击