OC的几个知识点总结

1.#import和#include的区别是
#import已经内置了条件预编译,防止重复包含,而#include则是需要手动使用#ifndef……#define
……#endif;来实现前置声明

2.objective-c内存管理原则
当使用new、alloc或copy方法创建一个对象时,该对象引用计数器为1。如果不需要使用该对象,可以向其发送release或autorelease消息,在其使用完毕时被销毁。
如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1,并且被设置为autorelease,不需要对该对象进行清理,如果确实需要这个对象,则使用retain,使用完毕后release。
如果retain了某个对象,需要release或autorelease该对象,保持retain方法和release方法使用次数相等。

[email protected]的作用
前置声明,说明已经包含了这个类

4.自动释放池是如何工作的
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

5.autorelease和release的区别?
只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.

6.readwrite,readonly,assign,retain,copy,nonatomic,getter,setter 属性的作用
(1)getter=getterName,setter=setterName,设置setter与 getter的方法名?(2)readwrite,readonly,设置可供访问级别
(3)assign,setter方法直接赋值,不进行 任何retain操作,为了解决原类型与环循引用问题
(4)retain,setter方法对参数进行release旧值再retain新值,所有 实现都是这个顺序(CC上有相关资料)
(5)copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
(6)nonatomic,非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

[email protected],@private,@protected的作用
默认为procted,作用和c++类似

8.self.name = “object”
name = “object”有什么不同
self的调用了set方法,会使计数器加1,而不带self的则不会

[email protected] person
- (void)setAge:(int)newAge 
{
self.age = newAge;
//setAge
//self->age = newAge;
}
@end
进入死循环


8.什么是retainCount
引用计数,对象的内部保存一个数字,表示被引用的次数。例如,某个对象被两个指针所指向(引用)那么它的retain count为2。需要销毁对象的时候,不直接调用dealloc,而是调用release。release会 让retain count减1,只有retain count等于0,系统才会调用dealloc真正销毁这个对象。


9.下面每行代码执行后,person的retainCount是
Person *person = [[Person alloc] init]; //1
[person retain]; //2
[person release];//1
[person release];//0


10.使用autorelease的时候,对象是在什么时候被release的?

autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。


12.如何安全的释放oc对象
[p release];
p = nil; 
[p release];
//self.p = nil;


13.[pool release] 和[pool drain]有什么区别?


见博客


14.
@autoreleasepool
{
for (long i = 0; i < largeNumber; i++) 
{
@autoreleasepool
{
Person *per = [[Person alloc] init];
[per autorelease];
}
}
}


[email protected] 
{
NSString *per = [[NSString alloc] init];
[per retain]; 
[per retain]; 
per = @"aa"; 
[per release];
[per release];
[per release];
}



14.objective-c中,与alloc语义相反的方法是dealloc还是release,与retain语义相反的方法是dealloc还是release,需要与alloc配对使用的方法是dealloc还是release,为什么?
//release release release

15.在一个类中又一个point对象p,使用@property声明为@property(nonatomic,assign)Point *p;那么生成的setP是怎么样的?
-(void)setP:(Point*)_p
{
p = _p;
}

16.在一个类中又一个point对象p,使用@property声明为@property(nonatomic,copy)Point *p;那么生成的setP是怎么样的?
-(void)setP:(Point*)_p
{
[p release];
p = [_p copy];
}


17.在一个类中又一个point对象p,使用@property声明为@property(nonatomic,retain)Point *p;那么生成的setP是怎么样的?

-(void)setP:(Point*)_p
{
if(p!=_p)
{
[p release];
p = [_p retain];
}
}

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment