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

  • 相关阅读:
    遍历当前窗口名字
    Delphi获取其它进程窗口句柄的3种方法
    Delphi判断一个字符是否为汉字的最佳方法
    Delphi拷贝目录(含子目录)的方法
    贴一份用delphi修改注册表改网卡MAC地址的代码
    delphi的TFileStream 内存流
    Delphi的ListView自动排序
    Delphi中上指定进程(进程名)
    Delphi-IP地址的隐藏
    C# 简单线程实例
  • 原文地址:https://www.cnblogs.com/huntaiji/p/3427679.html
Copyright © 2011-2022 走看看