程序员是怎么炼成的---OC题集--练习答案与题目(2)

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(数组名) 表示数组所占的内存字节数

上一篇:ThreadLocal实现session中用户信息 的线程间共享(精)


下一篇:LeetCode & Q66-Plus One-Easy