• IOS-01零碎知识总结


    1. 变量的@public @private @package @protected 声明有什么含义?

    @public  可以被所有的类访问

    @private  只有该类的方法可以访问,子类的都不能访问

    @protected  该类和所有类的方法可以直接访问

    @package  一个@package实例变量在实现这个类的可执行文件镜像中实际上是@public的,但是在外面就是@private,,Objective-C中的      @package与C语言中变量和函数的private_extern类似。任何在实现类的镜像之外的代码想使用这个实例变量都会引发link error,这个类型最常用于框架类的实例变量,使用@private太限制,使用@protected或者@public又太开放

    2. 线程是什么?进程是什么? 他们有什么区别和联系?

    1)进程 是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
    2)线程 是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    3)一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

    3.线程同步和异步 有什么区别?

    打个比方,如果你在等一个人,
    同步的时候,你会一直等到她来了之后才做其他事情,这个过程除了等待你啥都不会做,
    异步的时候,你一边在等,可能一边玩游戏或者是看报纸什么的,一直到她到来,你的等待状态才会结束
    在实现上,同步的过程会阻塞进程的所有其他操作,将同步转换为异步的最常见方法则是
    将会阻塞进程的等待操作放入到一个新的进程中,同时为该等待操作添加一个监视器,在检测到等待操作完成的时候结束等待的进程。

    4.获取一台设备的唯一标示符的方法有哪些?

    IOS系统中,获取设备唯一标识的方法有很多:

    一.UDID(Unique Device Identifier)

     UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。

    二.UUID(Universally Unique Identifier) 

    UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码.

    三.MAC Address

    四.OPEN UDID

    五.广告标示符(IDFA-identifierForIdentifier)

    六.Vindor标示符 (IDFV-identifierForVendor)

    Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同。

    经测试,只要设备上有一个tencent的app,重新安装后的identifierForVendor值不变,如果tencent的app全部删除,重新安装后的identifierForVendor值改变。

    但是很不幸,上面所有这些表示设备唯一号的标识,在IOS7中要么被禁止使用,要么重新安装程序后两次获取的标识符不一样。

    由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。

    通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。

    keychain里保存的信息不会因App被删除而丢失。所以,可以利用这个keychain这个特点来保存设备唯一标识。

    那么,如何在应用里使用使用keyChain呢,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。

    直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,我们可以使用已经封装好了的工具类KeychainItemWrapper来对keychain进行操作。

    KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上下载了GenericKeychain项目后,

    只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework 。KeychainItemWrapper的用法:

    /** 初始化一个保存用户帐号的KeychainItemWrapper */
    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"
                                                                       accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];  
     
    //保存数据
    [wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];    
     
    [wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];    
     
    //从keychain里取出帐号密码
    NSString *password = [wrapper objectForKey:(id)kSecValueData];      
     
    //清空设置
    [wrapper resetKeychainItem];

    其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会出错!

    5.堆和栈的区别?

    堆和栈的区别可以用如下的比喻来看出:
    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
    走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
    由度小。
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
    度大

    堆是先进先出,后进后出
    栈是后进先出,先进后出

     6.viewload,viewdidload,viewdidunload

    viewload : 加载视图

    viewdidload : 加载完视图后调用,设置视图的一些属性

    viewdidunload : 当系统内存吃紧时就会调用

    7.应用程序启动流程

    8.为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?

    答:会引起循环引用。
    这里delegate我们只是想得到实现了它delegate方法的对象,然后拿到这个对象的指针就可以了,我们不期望去改变它或者做别的什么操作,所以我们只要用assign拿到它的指针就可以了。
    而用retain的话,计数器加1。我们有可能在别的地方期望释放掉delegate这个对象,然后通过一些判断比如说它是否已经被释放,做一些操作。但 是实际上它retainCount还是1,没有被释放掉,要在UITableViewController的dealloc里面才被释放掉(这里我只是举 个例子,一般retain的对象都是在dealloc里被释放)。这里就会造成一些问题出现。

     9.写一个简单的便利构造器

    写一个简单地便利构造器
    +(Student *)studntWithName :(NSString *)aName andAge:(int)anAge
    {
    Student *stu=[Student alloc]initWithName :aName andAge:anAge];
    return stu;
    }

    10.ios截取字符串

      NSString *a = @"1.2.30";

        int  b= [[a substringWithRange:NSMakeRange(4,2)] intValue];

    解析如下:substringWithRange: 专门截取字符串的一块肉 

               NSMakeRange(4,2)    从第4个字符开始截取,长度为2个字符,(字符串都是从第0个字符开始数的哦~!

  • 相关阅读:
    Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
    Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
    Azure China (7) 使用WebMetrix将Web Site发布至Azure China
    Microsoft Azure News(4) Azure新D系列虚拟机上线
    Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
    Windows Azure Cloud Service (37) 浅谈Cloud Service
    Azure PowerShell (6) 设置单个Virtual Machine Endpoint
    Azure PowerShell (5) 使用Azure PowerShell创建简单的Azure虚拟机和Linux虚拟机
    功能代码(1)---通过Jquery来处理复选框
    案例1.用Ajax实现用户名的校验
  • 原文地址:https://www.cnblogs.com/mcj-coding/p/3561756.html
Copyright © 2020-2023  润新知