黑马程序员-----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可以包装任意类型,例如字符、数组、结构体等。
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值