• iOS面试题01


    1.#import和#include、@class有什么区别?#import<>和#import“”又有什么区别?

    答:1.#import和#include都能完整地包含某个文件的内容,#import能防止同一个文件被包含多次;

      2.@class仅仅是声明一个类名,并不会包含类的完整声明;@class还能解决循环包含的问题;

      3.#import<>用来包含系统自带的文件,#import“”用来包含自定义的文件。

    2.属性readwrite、readonly、assign、retain、copy、nonatomic、atomic、strong、weak各是什么作用?在哪种情况下使用?

      1.readwrite:同时生成get方法和set方法的声明和实现;这个属性会被当成读写的,是默认属性;

      2.readonly:只生成get方法的声明和实现;是只读的,在@implementation中,只需要一个读取器。如果你试图使用点操作符为属性赋值,将得到一个编译错误。

      3.assign:set方法的实现是直接赋值,用于基本数据类型,不更改索引计数。在使用垃圾收集的应用程序中,如果一个属性使用assign,且这个类符合NSCopying协议,则要明确指出这个标记,而不是简单地使用默认值,否则的话,将得到一个编译警告。(这再次向编译器说明你确实需要赋值,即使它是可拷贝的。??没看懂)

      4.retain:set方法的实现是release旧值,retain新值,用于OC对象。而不能用于Core Foundation对象(因为Core Foundation对象没有引用计数)

    eg:

    -(void)setName:(NSString *)name{
        if (_name != name) {
            [_name release];
            _name = [name retain];
        }
    }

      5.copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型。

    -(void)setName:(NSString *)name{
        if (_name != name) {
            [_name release];
            _name = [name copy];
        }
    }

    *******copy和retain的区别*******

      copy是建立了一个相同的对象,而retain不是。

      比如一个NSString对象,地址为Ox000111,内容为"name"

      copy到另外一个NSString之后,地址为0x000222,内容相同,新的对象的retain为1,旧的对象没有变化;

      retain到另外一个NSString之后,地址相同,为0x000111,内容也相同,旧的对象的retain值+1;

    ********end**************

     6.nonatomic:非原子性,set方法的实现不加锁,比atomic的性能高,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。

     7.atomic:原子性,设置成员变量的@property属性时,默认为atomic,提供多线程安全。setter函数会变成下面的:

    -(void)setName:(NSString *)name{
    
        {lock}
    
        if (_name != name) {
    
            [_name release];
    
            _name = [name retain];
    
        }
    
        {unlock}
    
    } 

    nonatomic禁止多线程,变量保护,提高性能。

    atomic是Objc使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误,是非常耗费资源的。如果没有使用多线程的通讯编程,则nonatomic是不错的选择。如果不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。

      8.strong:和retain一样,在使用时,引用计数也会加一。当所有指向它的strong类型都释放时,它会被释放,所有指向它的weak类型,都会被清空。

      9.weak,弱引用,当循环引用时,使用weak。当weak指针指向的对象一被释放,这些weak指针将被置为nil,有效地防止了野指针。同时weak不增加引用计数。

    未完待续--

  • 相关阅读:
    JSP学习笔记(一)
    【转】Key Presses
    【转】Event Driven Programming
    【转】Getting an Image on the Screen
    【转】Setting up SDL 2 on Visual Studio 2019 Community
    Windows定时任务copy到nfs目录
    DLL转存为IL文件及修改后重新生成DLL文件
    【转】Setting up SDL 2 on MinGW
    【转】Setting up SDL 2 on Code::Blocks 12.11
    【转】Setting up SDL on Windows
  • 原文地址:https://www.cnblogs.com/tanglimei/p/4606301.html
Copyright © 2020-2023  润新知