1、objective-c中有垃圾回收机制吗? 没有像java.C#一样的垃圾回收机制,但是有ARC自动引用计数器技术,根据对象的引用技术来判断对象是否还在使用,如果RC=0,则系统就会销毁对象,实现垃圾回收.
2、简述对内存管理的理解,内存管理的原则,内存管理的实现机制。
1)理解:
每个程序都会使用内存,在需要时分配内存,程序结束时释放占用的内存,如果只分配不释放内存,会造成内存泄露,内存占用增加甚至导致程序崩溃。在oc中,对象不断被创建、使用和销毁,为了不增加额外的内存,必须及时释放。
2)内存管理的原则: 对你自己拥有的对象负责,你只能释放你拥有的对象。
凡是你通过retain、alloc、copy等获得了所有权的对象,都必须在你不再使用它的时候,由你来release、autorelease等手段来释放对它的所有权。
在一定的代码段内,对同一个对象所做的retain、alloc、copy的操作次数应该与 release、autorelease操作的次数相等。
可以在类的dealloc方法中释放你所占有的实例变量。 对于便利构造器和访问器来说,你没有通过retain、alloc、copy获得对象的所有
权,因此在这些情况下你无须对获得对象进行额外的释放操作。 Autorelease只不过意味着“预定延迟发送一条release”,当前引用计数并没有
变。
3)实现机制
为了降低内存开销,需要及时释放不在被使用的对象。但是,需要明确两个问题:
是否有权利释放和什么时候释放。
释放的权利:参照内存管理原则。
释放的时机:对象可以有1个以上的所有者,所有者为0时释放对象。使用“引用计 数(retaincount)”,retaincount的数值根据对象所有者的数目增减,当retaincount=0 时,表示该对象不再被使用,系统释放该对象。
3、简述NSAutoreleasePool的工作机制。
在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下,你可以理解为:当你的代码在持 续运行时,自动释放池是不会被销毁的,这段时间内你也可以安全地使用自动释放的对象;当你的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动 释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。并且,在以下两种情况下,你需要手动建立并手动销毁掉自动释放池: 1.当你在主线程外开启其它线程时:系统只会在主线程中自动生成并销毁掉自动释放池。 2.当你在短时间内制造了大量自动释放对象时:及时地销毁有助于有效利用iPad上有限地内存资源。
当我们向池内发送release消息后,自动释放池就被销毁了.
4、调用一个便利构造器方法创建对象,是否需要释放。
不需要释放,因为便利构造器方法建立的对象已经方法自动释放池里,延迟释放
5、autorelease的对象是在什么时候被release的。
An autorelease pool stores objects that are sent a release message when the pool itself is drained.
当自动释放池被销毁的时候就会全部释放池子中的对象
6、解释(alloc、init、copy、retain、release、autorelease、dealloc, retainCount)定义和在内存管理中的作用。
alloc 创建对象,并把RC设为1 init 初始化对象
copy和retain都使RC的值加1,使用copy的属性必须实现了NSCopying协议
release和autorelease都使RC的值减1,autorelease不会立刻使对象释放,起到延迟释放的作用
dealloc方法是对象被销毁的时候系统调用的方法
retainCount记录RC的值,当retainCount=0时,对象就会被销毁
7、对象的内存是在什么时候被释放的(dealloc方法什么时候会被调用)?
对象内存RC的值为0的时候被释放,当对象被释放的时候dealloc就会被调用.
8、OC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是 dealloc还是release,为什么?
与alloc语义相反的方法是dealloc,因为alloc是创建对象的时候调用的方法,dealloc是销毁对象的时候调用的方法,对RC计数没有影响.与retain相反的方法是release,因为retain使RC值加1,release使RC计数减1;需要与alloc配对使用的方法是dealloc,对象被创建了就需要被销毁.
alloc与dealloc语义相反,创建变量、释放变量; retain与release语义相反,保留引用计数、释放引用计数; alloc与release配对使用,使用alloc给一个对象分配内存,retaincount加1,对象调用release方法,retaincount减1.
10、写一个完整的便利构造器。
-(id)initWithName:(NSString*)name age:(int)age gender:(NSString*)gender adderss:(NSString*)address//初始化方法,供便利构造器使用
{
if (self=[super init]) {
self.name=name;
self.age=age;
self.adderss=address;
self.gender=gender;
}
return self;
}
+(id)PeopleName:(NSString*)name age:(int)age gender:(NSString*)gender adderss:(NSString*)address//便利构造器
{
id obj=[[self alloc] initWithName:name age:age gender:gender adderss:address];
return obj;
}
11、有一个NSStirng类型的,retain方式声明name属性的setter和getter方法
声明部分:
@interface People : NSObject
{
NSString *name;
}
-(void)setName:(NSString *)aname;
-(NSString *)name;
@end
实现部分:
@implementation People
-(void)setName:(NSString *)aname
{
if (name!=aname ) {
[name release];
name= [aname retain];
}
}
-(NSString *)name
{
return name;
}
@end
12、以下每⾏行代码执⾏行后,person对象的retain count分别是多少?
Person *person = [[Person alloc] init]; RC=1
[person retain]; RC=2
[person release]; RC=1
[person release]; RC=0
13、在一个对象的方法里面:self.name = “object”; 和name =”object”
有什么不同吗?
self.name调用了对象里面的setter方法,给对象里面的name赋值,name="object"是给局部变量赋值,二者属于不同变量.
14、-(void)setPeople:(NSString *)p
{self.people = p;
}这段代码有什么问题。
这段代码没有处理内存问题,应该改为
-(void)setPeople:(NSString *)p
{
if(self.people!=p)
{[self.people release];
self.people =[ p retain];}
}
15、for (int i=0;i<largenumber:i++){
Person * p = [Person person]; [p study];
} 这段代码有什么问题,应该怎么去改?//for(int i=0;i<largenumber;i++)
16 、 Aclass *_aclass = [[[[Aclass alloc] init] autorelease] autorelease];解释每次方法执行后的retainCount。
alloc之后为1,autorelease之后为0,再autorelease就会出现野指针错误
17、用c语言写一个冒泡排序(排序的判断条件不是固定的,使用函数指针实现)。
void bubbleSort(int arr[],int n)
{
int *p=arr;int temp;
for (int i=0; i<9; i++) {
for (int j=0; j<9-i; j++) {
if (*(p+j)>*(p+j+1)) {
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
}
18、用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define DAYSOFYEAR (365*24*60*60)
19、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN (a)>(b)?(b):(a)
oc练习
1,(1)截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别
输出
NSString *str=@"20|http://www.baidu.com";
NSArray *arr= [NSArray array];
arr= [str componentsSeparatedByString:@"|"];
NSLog(@"%@",arr);
}
(2)从字符串@“aBcD_EfGk”中取出EfGk,并让大写字母转成小写,输出efgk
NSString *str=@"aBcD_EfGk";
str=[str lowercaseString];
NSArray *arr= [NSArray array];
arr= [str componentsSeparatedByString:@"_"];
NSLog(@"%@",arr[1]);
(3)给定一个字符串,判断字符串中是否含有“png”,如果有就删除。
NSString *str=@"abcdefdpngcdd";
str=[str stringByReplacingOccurrencesOfString:@"png" withString:@""];
NSLog(@"%@",str);
(4)如何将敏感字变成** 使用字符串替换函数:stringByReplacingOccurrencesOfString:withString:
(5)OC中的数字对象都有哪些,列出数据类型,选择任意一种数据类型创建数字对象。
NSNumber是Objective-c的数字对象,相当于将一个数字包装为一个对象
NSNumber*number=[NSNumber numberWithInt:123];//将int转换成NSNumber
int a=[number intValue];//得到int类型的值
(6)NSRange是什么数据类型,成员变量有哪些,都有什么作用?NSRange和 NSString怎么相互转换。
结构体数据类型,成员变量包括location,length.location决定位置,length决定长度,原型如下:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
NSRange和 NSString相互转换:
NSRange ran=NSMakeRange(12, 32); NSLog(@"%@",NSStringFromRange(ran));
NSRangeFromString(@"2,3");
(7)数组有什么特点?
1. 数组元素依次存放,使用连续的内存
2. 数组名为常量指针
3. sizeof(数组名) 表示数组所占的内存字节数