OC学习总结(二)
(一)内存管理
内存管理规范: 1、只要调用了alloc,必须有release(autorelease) 2、set方法的代码规范 1>基本数据类型:不需要内存管理,直接赋值 - (void) setSpeed:(int) speed { _speed = speed; } 2>OC对象类型 - (void) setCar:(Car *) car { //判断传进来的对象是否是当前正在使用的对象 if (car != _car) { //对当前正在使用的车进行一次release(计数器减1) [_car release]; //对新车进行一次retain操作 _car = [car retain]; } } 3、dealloc方法的代码规范(不要直接调用dealloc方法) 1>一定要[super dealloc],并且放到最后面 2>对self(当前)所拥有的其他对象做一次release - (void) dealloc { //Person对象被回收之前对正在使用的对象进行一次release(计数器减1) [_car release]; NSLog(@"person对象被回收了"); [super dealloc]; }
@property参数分类 1、内存管理相关参数 retain:release旧值,retain新值(适用于OC对象类型) assign:直接赋值(默认,适用于非OC对象类型) copy:release旧值,copy新值
2、是否生成set方法 readwrite:同时生成setter和getter方法的声明和实现(默认) readonly:只会生成getter方法的声明和实现(只读,一般用于不可修改的成员变量,如,人名、学号等)
3、多线程管理 nonatomic:性能高(一般就用这个) atomic:性能低(默认)
4、setter和getter方法的名称 setter:决定了setter方法的名称,一定要有冒号 :
getter:决定了getter方法的名称(一般用于BOOL类型) ARC原理:无强指针指向的对象,就会释放内存回收对象
指针分两种:1、强指针 __strong(默认情况下,所有指针都是强指针)
2、弱指针 __weak
循环引用解决方案:一端用strong,另外一端用weak,weak就是为循环引用准备的(ARC) #import <Foundation/Foundation.h>
// 利用typedef定义block类型,感觉跟指向函数的指针类似,就是把变量标识给换了。。。 // typedef int (*MyPoint)(int, int); typedef int (^MyBlock)(int, int);
int main(int argc, const char * argv[]) { int a = 10; __block int b = 20;
//无参数(可以省略右边^旁边的()号) void (^block)() = ^ { //a = 20; block内部不能直接修改外部的局部变量,写出来就直接报错了。。。 //在变量前面加上__block关键字后,block内部便可修改了 b = 8; //block内部可以直接访问外部的局部变量 NSLog(@"a = %d", a); NSLog(@"b = %d", b); }; block();
//有参数 void (^printLine)(int) = ^(int n) { for (int i=0; i<n; i++) { NSLog(@"------------------"); } }; printLine(5);
//用block类型定义一个block变量然后实现它 MyBlock sumBlock = ^(int a, int b) { return a + b; }; NSLog(@"a + b = %d", sumBlock(10, 8));
return 0;
} /* 1、使用场合 代理设计模式
2、基本用途 》可以用来声明一大堆方法(不能声明成员变量,这点跟Category(分类)一样) 》只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 》只要父类遵守了某个协议,就相当于子类也遵守了
3、协议中有两个关键字可以控制方法是否需要实现(默认是@required),在大多数情况下,用于程序员之间的交流(比如A写了某个协议给B用,B去实现的时候,如果有需要实现的方法而未实现,就会出现警告,B就知道这些方法是A想让他实现的)
4、协议遵守协议 》一个协议可以遵守其他多个协议,多个协议之间用逗号,隔开 》一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明 @protocol 协议名称<协议1, 协议2> */
#import <Foundation/Foundation.h>
//Protocol(协议)的定义格式 @protocol MyProtocol <NSObject> //基协议,类似继承中的基类NSObject,一般都会遵守基协议
//默认需要实现,不然会有警告 - (void) test1; //需要实现,不然会有警告 @required - (void) test2; //实现与否均可,不会有警告 @optional - (void) test3;
@end
//实现与否均可,不会有警告 @optional - (void) test3;
@end
//需要实现,不然会有警告 @required - (void) test2;
//实现与否均可,不会有警告 @optional - (void) test3;
@end |
OC学习总结(二)
最新推荐文章于 2025-05-18 15:26:54 发布