您的位置:首页 > 其它

OC学习总结(二)

2014-12-01 00:48 141 查看
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)

一端用retain,一端用assign (无ARC)

(二)Block(类似C语言中指向函数的指针)

#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;

}

(三)Protocol(协议,类似java中的接口(interface))

/*

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: