zoukankan      html  css  js  c++  java
  • 程序员是怎么炼成的---OC题集--练习答案与题目(2)

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

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/huntaiji/p/3427679.html
Copyright © 2011-2022 走看看