牛客网 iOS 题 1-20

牛客网 iOS 题 1-20

1.常用的多线程编程组件有

  1. GCD(Grand Central Dispatch)多线程优化技术
  2. NSThread
  3. NSOperationQueue

2.iOS 设计模式中,策略模式

3.Block 在未引用外部变量时,存储在哪一个内存区域?

答案:栈区

定义块的时候,所占的内存区域是分配在栈中,块只在它定义的范围内有效。

4.以下关于 tableView 编辑的方法中哪个不属于代理方法?

  1. -(void)setEditing:(Bool)editing animated:(Bool)animated
  2. -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
  3. -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
  4. -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

答案:1

A 是 tableView 的方法,不是代理

5.加密其实就是将明文转化成密文的过程,MD5(Message Digest Algorithm MD5)中文名为消息摘要算法第五版,默认生成128bit,即32位16进制,也可以生成16位16进制。

6.关于 Swift 语言(强类型语言 同 OC)

  1. var 用来修饰变量;
  2. let 用来修饰常量;
  3. 在声明常量和变量的时候可以使用表情符号、中文等命名常量名和变量名;
  4. 数据只能进行显式类型转换

7.关于支付,用户在接入 Ping++SDK 时,需要的三个参数包括

  1. API Key;
  2. 应用 ID;
  3. Notify URL;

8.以下动画类型中不属于 UIView 动画的是

  1. UIImageView;
  2. UIActivityIndicatorView;
  3. UIViewAnimation;
  4. UIViewMotionEffects;

答案:1

2 为转圈控件
3 为动画
4 为运动视觉效果

9.设置代理属性正确的是

  1. @property(nonatomic, assign)
  2. @property(atomic, copy)
  3. @property(nonatomic, copy)
  4. @property(nonatomic, retain)

答案:1

使用@property(nonatomic, weak)可能更好(引用计数不会改变);
assign 赋值也不会增加引用计数;
避免循环引用造成的内存泄漏;

10.子类和父类

  1. 子类可以重写父类的方法
  2. 子类没有重写父类的方法时也可以使用父类的方法
  3. 子类重写了父类方法后调用的是重写过后的方法

11.#import<> 和 #import""

  1. import 相比 #include 可以避免重复导入

  2. import<> 用来引入系统文件,编译器会在系统文件目录下去查找该文件

  3. import"" 用来引入用户自定义的文件,编译器会首先在用户目录中查找

12.以下代码打印出来的值是

NSString *str = @"lanou";
[str retain];
NSLog(@"%lu", str.retainCount);
  1. 1;
  2. 2;
  3. -1;
  4. ULONG_MAX;

答案:4

按评论,如果输出格式为 %ld,输出为 -1

13.在 Objective-C 中,以下说法正确的是()

  1. 对象被创建出来后,它的引用计数是1;
  2. 使用 @class 类名,就可以把想要的类的接口文件中内容包含进来;
  3. 一个文件中可以声明多个类;
  4. 使用便利构造器创建的对象需要通过调用 release 方法释放

答案:3

谁开辟的谁管理。例如便利构造器 ,没有使用alloc开辟内存空间,所以我们不会对便利构造器创建的对象release, 但是便利构造器对象仍需要释放,在便利构造器封装的方法里边自动封装了autorelease。

@class只是告诉编译器,其后面声明的是类的名称。

刚创建的对象没有被引用的话,引用计数是0。只有某个变量指向了这个对象时才会+1。

14.iOS 应用程序中,main 函数作用甚少

  1. main 函数的主要工作是控制 UIKit framework。
  2. 大多数实际工作由 UIApplicationMain 函数来处理。
  3. main 例程只做三件事:
    1. 创建一个自动释放池;
    2. 调用 UIApplicationMain 函数;
    3. 释放自动释放池。

15.什么是 key window

key window 是指可接受到键盘输入和其他非触摸事件的 UIWindow,一次只能有一个 key window。
UIApplication 的 key window 是 App 中唯一的那个 UIWindow 对象

16.UIViewController 的生命周期

  1. initWithNibName:bundle:

初始化UIViewController,执行关键数据初始化操作,非StoryBoard创建UIViewController都会调用这个方法。

  1. initWithCoder:

如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle不会被调用,但是initWithCoder会被调用。

  1. awakeFromNib

当awakeFromNib方法被调用时,所有视图的outlet和action已经连接,但还没有被确定,这个方法可以算作适合视图控制器的实例化配合一起使用的,因为有些需要根据用户喜好来进行设置的内容,无法存在storyBoard或xib中,所以可以在awakeFromNib方法中被加载进来。

  1. loadView

当执行到loadView方法时,如果视图控制器是通过nib创建,那么视图控制器已经从nib文件中被解档并创建好了,接下来任务就是对view进行初始化。

  1. viewDidLoad

  2. viewWillAppear

  3. viewWillLayoutSubviews

  4. viewDidLayoutSubviews

  5. viewDidAppear

  6. viewWillDisappear

  7. viewDidDisappear

  8. dealloc

  9. didReceiveMemoryWarning

在内存足够的情况下,app的视图通常会一直保存在内存中,但是如果内存不够,一些没有正在显示的viewController就会收到内存不足的警告,然后就会释放自己拥有的视图,以达到释放内存的目的。但是系统只会释放内存,并不会释放对象的所有权,所以通常我们需要在这里将不需要显示在内存中保留的对象释放它的所有权,将其指针置nil。

17.在 UIKit 中,frame 与 bounds 的区别是

frame 的参考系是父视图的坐标,bounds 的参考系是自身坐标

18.使用 imageNamed 方法创建 UIImage 对象时,与普通的 init 方法有什么区别?

imageNamed 采用了缓存机制,第一次读取图片时会把 image 存到某个缓存里面,第二次读取的时候系统就会直接从那个缓存中获取。

19.使用 protocol 时,声明一组可选择实现与否的函数,需要在声明的前一行加上:

  1. @required
  2. @optional
  3. @interface
  4. @protocol

答案:2

协议关键字有 @required 和 @optional,其中 @required 是默认值

20.在没有 navigationController 的情况下,要从一个 ViewController 切换到另一个 ViewController 应该

[self presentViewController:nextViewController animated:YES];

在有 navigationController 时可以使用 pushViewController 和 popViewController

你可能感兴趣的:(牛客网 iOS 题 1-20)