iOS 不可忽视的知识点

1. OC有多继承吗?没有,用什么代替?

答:没有多继承。cocoa中所有类都是NSObject的子类,多继承用@protocol 委托代理来实现。

2. OC中有私有方法吗?有私有变量吗?

答:私有变量有。在类的实现即.m文件中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量就是@private的。

  OC中没有真正的私有方法。

3. #import  #include  @class 区别?

① 在.h文件中使用@class(减少编译时间),如使用请在.m文件中#import;

② #import 可以避免两个类之间互相引用,#include 不可以;

③ 头文件使用自定义代理、Category、继承的时候,需要使用#import;

④ <> 和 " "区别,前者直接使用系统库路径,后者会从用户、安装、系统目录寻找;

⑤ 两个类互相引用,一个需用@class;

4. 进程、线程,怎么去理解?

答:一个进程包含多个线程。

  进程有独立的地址空间,一个进程崩溃,不会对其他的进程产生影响,而线程没有单独的地址空间,一个线程死掉等于整个进程死掉。

  所以,理论上多进程的程序比多线程的程序健壮,但进程切换过程耗费资源大,效率要差。如果要求同时进行(并行)某些操作,只能用线程。

5. 堆、栈,怎么去理解?

堆栈的区别:

① 堆空间的内存是动态分配的、一般存放对象、并且需要手动释放内存。

② 栈空间的内存是由系统自动分配、一般存放局部变量等、不需要手动管理内存。

管理方式不同:

堆,释放工作要人为控制,容易产生内存泄露(memory leak)。

栈,由编译器自动管理。

从申请内存大小方面不同:

栈,空间比较小<2M>。

堆,空间比较大。

从数据存储方面讲:

栈空间中一般存储基本类型,对象的地址。

堆空间一般存放对象本身,block的copy等。

6. 浅拷贝、深拷贝的区别?

浅拷贝,只复制指向对象的指针,但对象本身资源还只有一份,就有两个指针指向同一个对象;

深拷贝,复制引用对象本身,就有两个指针分别指向两个对象。

NSString *str = @"123";
NSString *strCopy = [str copy];
NSMutableString *mustr = [str copy];
NSMutableString *muCopy = [str mutableCopy];
[mustr appendString:@"4"];    //会直接崩溃
[muCopy appendString:@"5"];
NSLog(@"str = %@    strCopy = %@    mustr = %@    muCopy = %@",str,strCopy,mustr,muCopy);
NSLog(@"str地址%p    strCopy地址%p    mustr地址%p     muCopy地址%p",str ,strCopy,mustr,muCopy);

输出结果: 

7. 返回到指定的页面?

for (UIViewController *controllers in self.navigationController.viewControllers) {
        if ([controllers isKindOfClass:[指定的页面 class]]) {
            [self.navigationController popToViewController:controllers animated:YES];
        }
    }

8. 取余、取模的理解?

i = 14;

i % 2:取余,结果等于0或者1;

i / 2:取模,结果等于0、1、2、3、4、5、6

9. 点击不同按钮进入到不同对应的控制器。

NSString *vcClassName = [button.currentTitle  stringByAppendingString:@"viewcontroller"];
UIViewController *vc = [[NSClassFromString(vcClassName) alloc]init];
vc.title = button.currentTitle;
[self.navigationController pushViewController:vc animated:YES];

10. 调用打电话API。

① 调用完之后,iPhone界面会停留在电话界面。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://10010"]];

② 调用完之后,会返回到应用程序的界面。

UIWebView *callwebview = [[UIWebView alloc]init];
NSURL *telUrl = [NSURL URLWithString:@"tel://10086"];
[callwebview loadRequest:[NSURLRequest requestWithURL:telUrl]];
[self.view addSubview:callwebview];

 

posted @ 2019-07-22 17:48  低调De奢华~  阅读(134)  评论(0编辑  收藏  举报