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方法使用次数相等。



3.@class的作用

前置声明,说明已经包含了这个类



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,非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。



7.@public,@private,@protected的作用

默认为procted,作用和c++类似



8.self.name = “object”

name = “object”有什么不同

self的调用了set方法,会使计数器加1,而不带self的则不会



9.@implementation 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];

}

}

}





13.@autoreleasepool 

{

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
如果觉得我的文章对你有用,请随意打赏: ☞已打赏列表