黑马程序员——OC总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
1.import的作用
  impor是导入外部文件或框架,跟include功能相同,但是import的优点是可以防止重复导入。

2.说一下面向对象,面向对象有哪些特性,分别说一下
    面向对象:面向对象简称OOP,在解决问题时我们只关心解决此方法的工具,也就是对象,不关心解决此方法的过程。
  特性:有三个特性:
    封装:封装是为了防止外界直接访问或修改对象的成员变量,提高了程序安全性。
    继承:子类继承父类,子类完全拥有父类的成员变量或方法。减少了代码量,提高了类之间的联系。
    多态:某一类事物的多种形态,例如我们可以通过父类调用子类方法。减少了代码量,提高了工作效率。
  
3.OC方法与C函数的区别
    1>OC方法归对象所有,C函数是归整个程序所有。
    2>OC方法可以访问对象的成员变量,而C函数不能访问成员变量。
    3>函数不能写在@interface 和 @end之间。

4.OC对象方法与OC类方法的区别
     1>对象方法以—开头,类方法以+开头。
     2>对象方法可以访问成员变量,类方法不能访问成员变量。
     3>对象方法由对象调用,类方法由类调用。
     4>对象方法可以传递参数,类方法不能传递参数。

5.self与super的用法
    self是一个指针,指向了方法的调用者,如果是对象调用,则指向对象,如果是类调用,则指向类
    super是调用父类方法,一般用于在重写父类方法的时候需要保留某些方法。

6.成员变量的作用域 
    @private:代表成员变量只能被当前类直接访问。
    @protected:代表成员变量能被当前类或子类直接访问,是默认属性。
    @public:代表成员变量能在任何地方被直接访问。
    @package:代表成员变量只能在同一框架内直接被访问。

7.重写description方法的作用

    更改NSLog显示在屏幕上的格式。
   -description默认是以类名:内存地址 显示
   +description默认是以类名显示。

8.说一下万能指针,点语法
   万能指针:就是id,它可以指向任何对象,相当于NSObject *
  点语法:是成员变量的setter和getter方法的简写。如果通过点语法赋值,则是setter方法,如果通过点语法返回某个值,则是getter方法。

9.@property与@synthesize的用法
   @property:
        1>可以自动声明成员变量的setter和getter方法。在XCODE4.5以后还可以自动实现变量的setter和getter方法。
        2>可以自动生成下划线_加成员变量名的成员变量(eg:_age),类型是@private。
        3>@property 是在头文件中使用。
   @synthesize:
        1>可以自动实现成员变量的setter和getter方法。
        2>可以自动生成成员变量名(eg:age),且类型是@private。
        3>@synthesize是在.m文件中使用。

10..h和.m文件的分工
       .h:此文件是声明有哪些方法和成员变量 。
      .m:此文件是实现变量的方法。

11.内存管理的管理范围、原理、原则、体现在哪些地方
      管理范围:所有继承NSObject的对象。
      原理:通过引用计数器是否为0进行判断,如果某个对象的引用计数器为0,则此对象已经被回收,否则没有被回收
      原则:1>如果谁想使用某个对象,则需要对对象进行retain操作。
                2>如果谁想释放某个对象,则需要对对像进行release操作。
                3>谁retain,谁release,谁alloc,谁release。
      体现:1>@perproty参数方面,拥有retain、assign和copy。retain和copy会对对象的引用计数器+1;
                2>autorelease方面。会对对象池中的所有对象进行一次release操作。

12.@property的参数有哪些,他们的作用分别是什么?

      set内存管理方面:
            retain:对旧值进行release,对新值进行retain操作。
            assign:说明不需要进行内存管理,直接赋值
            copy:release旧值,copy新值。
      是否需要setter和getter方法方面:
           Readwrite:需要setter和getter方法。
           Readonly:只需要getter方法。
      方法名方面:
           setter = 方法名。设置setter方法名
           getter = 方法名。设置getter方法名
     多线程方面:
          nonatomic:不需要多线程,高性能。
                atomic:使用多线程,性能较低。

13.autorelease的作用、好处、注意
        作用:1>将所有对象加入自动释放池中。
                   2>当池销毁时会对池中所有对象进行一次release操作。
                   3>会返回对象本身。
                   4>不会影响对象引用计数器。

        好处:1>不需要关心对象释放时间。
                   2>不需要关心何时使用release。

       注意点:1>如果程序占用内存较大,则不使用autorelease。
                     2>如果程序占用内存较小,则使用autorelease影响不大。

14.什么是分类(category)?分类与继承的区别?
   分类:分类是在不更改原有类成员变量和方法的情况下,给原有类增加方法。
   分类与继承的区别:
      1>分类只能增加方法,不能增加成员变量;
           继承是子类完全拥有父类的成员变量和方法,还可以在父类的基础上增加自己的成员变量和方法。

      2>分类方法名如果和原有类的方法名相同,则分类的方法会覆盖原有类中的方法。
           继承下子类中的方法名不能和父类中的方法名相同。

15.说一下什么是协议(protocol)?以及其中协议中的两个关键字?
    协议是用来声明多种方法,以方便其它类能够随时调用,提高了程序编写效率。
   @required:说明此方法必须被实现,如果不被实现就会发出警告。
   @optional:说明此方法可以被实现,也可以不被实现。

16.说一下你对代理的理解
   定义:为其它对象提供一种代理以用来控制这个对象。
     eg: 小明不想做饭,因此请了个保姆,但是请保姆需要签一份协议,保姆需要遵守协议。所以保姆就是代理,代理需要遵守某个协议。
   条件:如果要成为代理,则必须遵守某个协议(协议用于声明方法,限制代理必须拥有某个方法)。
   作用:可以监听某个方法是否被触发。
   优点:耦合性较低,增加了代码的弹性。
       eg:代理被删除了,但是Person还在。代理和对象之间互不影响。

17.block的作用,与函数有什么异同
       作用:block用于保存一段代码,方便程序随时调用
       与函数相同点:1>都有返回值
                                 2>都有形参
                                 3>调用方法相同
                                 4>都可以保存代码

       与函数不同点:1>blok的标志是^,而函数没有
                                 2>block默认情况下不能修改局部变量值,函数可以。
                                 3>在block情况下,当语句结束时,需要在大括号外部添加分号,而函数不需要。

18.@class与#import有什么区别
         1>@class只是在.h文件中声明有某个类,并不知道此类的成员变量和方法。
               #import可以被导入文件的所有信息,包括成员变量和方法。
         2>使用@class时,如果同时导入上百个文件,一旦被导入文件有所更改,则只需更改头文件,不需重新编译,效率较高。
             如果使用#import,则需要重新编译,效率较低。
         3>如果在.m文件中需要调用某个类的成员变量和方法,则需要#import导入。

19.常用的结构体有哪些?

    NSRange:表示范围。
    NSPoint/CGPoint:表示点位置
    NSSize/CGSize:表示UI的尺寸大小
    NSRect/CGRect:表示UI的位置和尺寸大小

20常用的类以及集合
   常用类:NSString/NSMutableString
   集合:NSArry/NSMutabArry(有序)、NSSet/NSMutableSet、NSDictonary/NSMutableDictonary、NSDate、NSObject

21.copy与retain的区别?
   浅拷贝情况下:copy就是retain。
   深拷贝情况下:copy会产生新对象,源对象引用计时器不变,副本计数器加1.

22.集合中排序有哪些方式?
     有四种排序方法:
       1>简单排序:
    NSArray *array = [NSArray arrayWithObjects:@"abc",@"456",@"123",@"789",@"ef", nil];
    NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"排序后:%@",sortedArray);

       2>block排序(官方推荐)
 NSArray *array = [NSArray arrayWithObjects:@"1bc",@"4b6",@"123",@"789",@"3ef", nil];
    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

   //这里的代码可以参照上面compare:默认的排序方法,也可以把自定义的方法写在这里,给对象排序
        NSComparisonResult result = [obj1 compare:obj2];
        return result;
    }];
    NSLog(@"排序后:%@",sortedArray);
   
     3>自定义排序
 NSArray *array2 = [array sortedArrayUsingSelector:@selector(compareStudent:)];
    NSLog(@"array2:%@", array2);

   - (NSComparisonResult)compareStudent:(Student *)stu {
    // 先按照姓排序
    NSComparisonResult result = [self.lastname compare:stu.lastname];
    // 如果有相同的姓,就比较名字
    if (result == NSOrderedSame) {
        result = [self.firstname compare:stu.firstname];
    }
    return result;
}
   
      4>高级排序
 // 1.先按照书名进行排序
    NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES];
    // 2.再按照姓进行排序
    NSSortDescriptor *lastnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastname" ascending:YES];
    // 3.再按照名进行排序
    NSSortDescriptor *firstnameDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstname" ascending:YES];
    // 按顺序添加排序描述器
    NSArray *descs = [NSArray arrayWithObjects:bookNameDesc, lastnameDesc, firstnameDesc, nil];
    
    NSArray *array2 = [array sortedArrayUsingDescriptors:descs];
    NSLog(@"array2:%@", array2);
   
23.遍历集合有几种方式?分别说一下
    有三种方法遍历:
        方法一:普通遍历:
for (int i=0; i<array.count;i++)
      {
    NSLog(@"%@",array[i]);
     }

     方法二:快速遍历
for (id obj in array)
   {
        NSLog(@"%@",obj);
     }

      方法三:block遍历
 [array enumerateObjectsUsingBlock:
      ^(id obj,NSUInteger idx, BOOL *stop)
    {
       NSLog(@"index = %d,元素 = %@",idx,obj);
        if ( idx = 0)
         {
      *stop = YES;// 停止遍历
        }
          }  ];

24.NSValue与NSNumber的区别
    1>NSNumber是NSValue的子类。
    2>NSNumber只能包装基本数据类型,而NSValue可以包装任意类型,例如字符、数组、结构体等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值