zoukankan      html  css  js  c++  java
  • 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不增加引用计数。

    未完待续--

  • 相关阅读:
    批量新增百万条数据 十百万条数据
    sqlserver 组内排序
    EF ++属性会更新实体
    Entity Framework Core: A second operation started on this context before a previous operation completed
    abp Cannot access a disposed object. A common cause of this error is disposing
    abp xunit Can not register IHostingEnvironment. It should be a non-abstract class. If not, it should be registered before.”
    hangfire enqueued but not processing(hangfire 定时任务入队列但不执行)
    EF 更新实体 The instance of entity type 'BabyEvent' cannot be tracked because another instance
    datatable to entiy list 不支持可空类型和枚举类型
    webapi 设置不显示接口到swaggerUI
  • 原文地址:https://www.cnblogs.com/tanglimei/p/4606301.html
Copyright © 2011-2022 走看看