2016-06-29 11:28:06 sinat_31063657 阅读数 3140

最近在项目中集成了信鸽推送,记录下集成信鸽的过程.


一.下载信鸽SDK

下载地址  http://xg.qq.com/xg/apps/ctr_app 

二.到苹果开发者中心注册推送证书.

这部分如果不清楚可以看 信鸽的ios证书设置指南.

证书指南网址:

http://developer.qq.com/wiki/xg/iOS接入/iOS%20证书设置指南/iOS%20证书设置指南.html


这部分我遇到问题就是把导出的p12 文件转换成pem文件这里,指南里只给了一句代码,不熟悉命令行的同学看这里:

1).打开终端 cd desktop  回车

2)openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes回车


这就OK啦


记得把推送证书的名字改为 CertificateName或者上面的名字改openssl pkcs12 -in 你的证书的名字.p12 -out你的证书的名字.pem -nodes


就是记得改名字就行了


三 .接入SDK 


1)

  • 获取Access ID和Access Key

前往信鸽官网 http://xg.qq.com ,用QQ号登录,添加应用基本信息并注册,之后可获取Access ID和Access Key


2)

  • 工程配置

1、 下载信鸽SDK压缩包到本地并解压;

2、 创建或打开Xcode iOS工程;

3、 将XGSetting.h 和 XGPush.h 和 libXG-SDK.a添加到Xcode工程

4、 添加对以下libraries的引用。包括CFNetwork.framework , SystemConfiguration.framework , CoreTelephony.framework , libz.dylib , libXG-SDK.a,Security.framework


介入程序


在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;  中写入

#pragma mark 信鸽推送


    [XGPushstartApp:2200199136appKey:@"IYU4A5NJ561W"];//你注册的Access ID和Access Key

    

    [selfmanagerPush:launchOptions];//这个是我自己写的方法

    

    //获取推送的信息字典

    _remoteNotification = [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    

    if (_remoteNotification) {

        

        _isLaunchedByNotification =YES;//用来判断是否是点击推送进入项目

        

    }else {

    

        _isLaunchedByNotification =NO;

        

    }


//下面的方法把信鸽提供的方法统一到了一个方法里

-(void)managerPush:(NSDictionary *)launchOptions{

    //注销之后再次注册之前的准备

    void (^successCallback)(void) = ^(void){

        //如果变成需要注册状态

        if(![XGPushisUnRegisterStatus])

        {

            //iOS8注册push方法

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_

            

            float sysVer = [[[UIDevicecurrentDevice]systemVersion]floatValue];

            if(sysVer <8){

                [selfregisterNofitication];

            }

            else{

                [selfregisterPushForIOS8];

            }

#else

            //iOS8之前注册push方法

            //注册Push服务,注册后才能收到推送

            [self registerNofitication];

#endif

        }

    };

    [XGPushinitForReregister:successCallback];

    //推送反馈(app不在前台运行时,点击推送激活时)

    [XGPushhandleLaunching:launchOptions];

    

    //推送反馈回调

    void (^successBlock)(void) = ^(void){

        //成功之后的处理

        NSLog(@"[XGPush]handleLaunching's successBlock");

    };

    

    void (^errorBlock)(void) = ^(void){

        //失败之后的处理

        NSLog(@"[XGPush]handleLaunching's errorBlock");

    };

    

    //角标清0

    

    [[UIApplicationsharedApplication]setApplicationIconBadgeNumber:0];

    //清除所有通知(包含本地通知)

//    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    

    [XGPushhandleLaunching:launchOptionssuccessCallback:successBlockerrorCallback:errorBlock];

    

}

//iOS5之后注册通知

- (void) registerNofitication {

    [[UIApplicationsharedApplication]registerForRemoteNotificationTypes:(UIUserNotificationTypeAlert |UIUserNotificationTypeBadge |UIUserNotificationTypeSound)];

}


下面这两个方法并没有用到,但这些是成功通知的回调

//注册UserNotification成功的回调

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

{

    //用户已经允许接收以下类型的推送

    //UIUserNotificationType allowedTypes = [notificationSettings types];

    

}

//按钮点击事件回调

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler{

    if([identifierisEqualToString:@"ACCEPT_IDENTIFIER"]){

        NSLog(@"ACCEPT_IDENTIFIER is clicked");

    }

    

    completionHandler();

}

下面  注册设备信息
在application: didRegisterForRemoteNotificationsWithDeviceToken中调用。

注意:设备的deviceToken由苹果下发,可能会产生变化。同一设备在开发环境和生产环境是不相同的。


- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    

//    NSString * deviceTokenStr = [XGPush registerDevice:deviceToken];

    

    void (^successBlock)(void) = ^(void){

        //成功之后的处理

        NSLog(@"[XGPush Demo]register successBlock");

        当程序未运行时 收到通知  通过_isLaunchedByNotification获得是否是通知启动的项目

此时可以做出判断 调子或者注册通知


        if (_isLaunchedByNotification) {


            if ([_remoteNotification[@"grabOrder"]integerValue]==31) {

                

                NSNotificationCenter *center = [NSNotificationCenterdefaultCenter];

                

                [center postNotificationName:@"grab"object:niluserInfo:nil];

                

            }

        }

    };

    

    void (^errorBlock)(void) = ^(void){

        //失败之后的处理

        NSLog(@"[XGPush Demo]register errorBlock");

    };

    设置账号与设备 可以选择自己需要的位置,我写到了登陆成功之后,注意 设置账号之后要调用注册deviceToken方法

    // 设置账号

//    [XGPush setAccount:@"131"];

    

    //注册设备

    NSString * deviceTokenStr = [XGPushregisterDevice:deviceTokensuccessCallback:successBlockerrorCallback:errorBlock];

    

    //如果不需要回调

    [XGPush registerDevice:deviceToken];

    

    _deviceToken = deviceToken;

    

    //打印获取的deviceToken的字符串

    NSLog(@"[XGPush Demo] deviceTokenStr is %@",deviceTokenStr);


}

//如果deviceToken获取不到会进入此事件

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {

    

    NSString *str = [NSStringstringWithFormat:@"Error: %@",err];

    

    NSLog(@"[XGPush Demo]%@",str);

    

}

app运行时(无论前台还是后台运行) 收到通知会调用此接口


- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

{

    _isLaunchedByNotification =YES;


    //推送反馈(app运行时)

    [XGPushhandleReceiveNotification:userInfo];

    

    //回调版本示例

    

     void (^successBlock)(void) = ^(void){

     //成功之后的处理

     NSLog(@"[XGPush]handleReceiveNotification successBlock");

     };

     

     void (^errorBlock)(void) = ^(void){

     //失败之后的处理

     NSLog(@"[XGPush]handleReceiveNotification errorBlock");

     };

    NSLog(@"userInfo%@",userInfo);

    

    

     void (^completion)(void) = ^(void){

     //完成之后的处理

         //userinfo里是运行时推送的弹窗信息

         

         int i =0;

         i = i+ [userInfo[@"badge"]intValue];

         [UIApplicationsharedApplication].applicationIconBadgeNumber=i;

         

         if (_isBackGround) {  //用这个bool值判断是否是从后台运行时打开 

             

             _isBackGround =NO;

             

         }else {   //不是后台运行时打开后的操作

                  }

         

     NSLog(@"[xg push completion]userInfo is %@",userInfo);


     };

     

     [XGPushhandleReceiveNotification:userInfosuccessCallback:successBlockerrorCallback:errorBlockcompletion:completion];

    

}

特别注意: 模拟器是不能收到通知的,调试通知的时候用真机调试.

另外,证书一定要对应.生产环境和开发环境要对应好.测试设备最好添加.

大家有遇到这里没写的问题可以留言,大家一起讨论(*^__^*) 



2016-06-10 14:26:44 A11085013 阅读数 1122
<?php
$target_path  = "/Applications/XAMPP/xamppfiles/htdocs/www/abc/";//接收文件目录
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
   echo "The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded";
echo($_POST[asktitle]);
echo($_POST[asksex]);
echo($_POST[askage]);
echo($_POST[askdesc]);
echo($_POST[asktel]);
echo($_POST[wdname]);
echo($_POST[tus]);
}  else{
   echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error'];


}
?>
2016-09-26 13:40:07 Yj_sail 阅读数 17983

解决方案链接:https://openclub.alipay.com/read.php?tid=250&fid=2

一.如何签约APP支付接口
第一步:进入管理中心:https://openhome.alipay.com/platform/appManage.htm
第二步:选择或者创建一个应用,再选择功能信息-》申请功能-》勾选APP支付-》确定添加。
第三步:点击上方查看如何使用进入到签约管理。
点击立即签约,签约完成即可获得接口权限,就可以联调了

二.最近很多接入支付宝APP支付报错ALI40247,下面写一下处理方法

最新同步一种处理方案(ALI40247):已经签约生效APP支付的商户,需要在功能信息里面删除APP支付,在重新添加一次(要求是已经签约过APP支付的商户操作才有效)

1.没有APP支付权限导致
检查您使用的这个appid是否签约过APP支付这个接口的权限。如果没有签约看上面的《如何签约APP支付接口》

2.有移动支付接口(接口名称:mobile.securitypay.pay)权限没有app支付接口(接口名称:alipay.trade.app.pay)权限。以为可以使用APP支付接口,这是两个接口如果有移动支付接口(接口名称:mobile.securitypay.pay)权限想使 用APP支付接口(接口名称:alipay.trade.app.pay),可以进行重新签约参考《接口签约方案》第三步 帖子地址:https://openclub.alipay.com/read.php?tid=276&fid=25

3.如果已经签约了APP支付接口,还是报这个错误
需要检查商户公钥上传的位置是否正确
a.移动支付接口(接口名称:mobile.securitypay.pay)的上传合作伙伴密钥管理
b.app支付接口(接口名称:alipay.trade.app.pay)的上传开放平台密钥管理
注意:使用的接口不同上传位置不同
这个接口应该使用开放平台密钥管理里面的密钥,检查您这个接口使用的appid下面的公钥(自己上传的商户公钥)和支付宝报公钥。因为没有上传商户公钥或者使用的商户公钥和商户私钥不匹配也会导致这个错误

4.请求支付编码问题和没有做url encode
编码:就是请求了utf-8 但是用了gbk的编码
encode:app支付接口(接口名称:alipay.trade.app.pay)对请求字符串的所有一级value(biz_content作为一个value)进行encode。

5.管理中心》我的应用》状态》(注意:)已上线才可以使用否则也会报这个错误(如下图)
点击查看原图
6.检查应用是否已经上线(如下图)
点击查看原图
在这个链接的appid上输入开发者的APPID :https://openhome.alipay.com/platform/selfSignContract.htm?appId=2016xxxxx 查询是否显示已签约(如下图)
点击查看原图

然后进行访问,查看接口签约状态(如下图)
点击查看原图

7.如果上面的方式无法处理建议咨询支付宝的在线技术支持
https://cschannel.alipay.com/newPortal.htm?scene=mt_zczx&token=&pointId=&enterurl=https%3A%2F%2Fsupport.open.alipay.com%2Falipay%2Fsupport%2Findex.htm

2018-11-26 13:22:37 weixin_41077029 阅读数 439

问题描述:做微信公众号的时候发现iso不能显示,andriod里能正常调上传接口?

最后发现是url不一样

   // 微信config配置
    initConfig() {
      let _this = this;
      let url = "";
      // 判断是否是ios微信浏览器
      if (window.__wxjs_is_wkwebview === true) {
        url = this.$store.state.url.split("#")[0];
      } else {
        url = window.location.href.split("#")[0];
      }
      $ajax(
          "/getConfig",//获取配置信息的接口(后端给的)
          {url: url},  //传给后端的data
          "wexin"
        )
        .then(res => {
          // alert(JSON.stringify(res));
          _this.$wx.config({
            debug: false,
            appId: res.data.appid,
            timestamp: res.data.timestamp,
            nonceStr: res.data.nonceStr,
            signature: res.data.signature,
            jsApiList: [
              "chooseImage",
              "previewImage",
              "uploadImage",
              "downloadImage"
            ]
          });
        });
    },

 

2016-07-24 19:01:19 u012411480 阅读数 5259
面试看面试官水平和心情,我遇到一本正经的问题还有“安卓用三个按键,苹果为什么只有一个 home键?““你觉得你是个有爱的人吗?”“你男朋友是在哪里做什么工作的?“说和工作相关吧貌似也有点意义,说专业吧问题也有点任性跑偏 。。。只能说整理些下面是自己整理的,答案不一定对,哪里错了望不吝指正。

正题:iOS面试题集锦及必需具备的知识

  • 至少10款以上iOS领域的开源组件: AFNetworking (NSURLConnction+NSOperation),
    Masonry,SDWebImage,MBProgreeHUD,MJRefresh,MWPhotoBrowser ,FMDB等

  • 怎样或自定义过哪些控件:
    button View datepicker 标签控制器 导航栏 nsoperation
    绘图api:进度指示器 section

  • 屏幕适配:
    (1)常用适配方法及第三方Masonry,SDLayout使用等
    (2)适配点:状态栏7以后加20;label文本自适应,8的警告框被替换,8的两个定位属性,获取屏幕宽高硬性计算或等比例,autoLayout,sizeClass约束,手写代码约束条件,根据屏幕类型判断:判断设备类型(高度或类型)可以大屏使用collectionView小屏使用tableView。
    Masonry;整体替换VIew
    (3)像素适配:4以前,屏幕的坐标和像素1:1.
    4S之后1:2;屏幕大小与图片大小比例不是1:1就是1:2;因为坐标不变,所以可以绝对定位,提供一倍二倍图系统自动选择。5系列高度增加88点,使用自动布局,直接使用2倍图。
    6之后,自动布局,2倍图,6+是1:2.6

  • Json:基于JavaScript,轻量级数据交换格式

    • 标准JSON格式的注意点:key必须用双引号,键值对逗号隔开 ,键值用 冒号。
      {“name” : “jack”, “age” : 10}
      {“names” : [
      “jack”, “rose”, “jim”
      ]
      }

    • JSON – OC 转换对照表
       JSON – OC 转换对照表

    • 解析方案:在iOS中,JSON的常见解析方案有4种

      第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
      苹果原生(自带):NSJSONSerialization(性能最好)

  • 线程安全:确保在主线程调用UIKit(不在后台属性赋值);次线程异步操作使用__weak;集合类不可变的是安全的;写return [array copy]来确保返回对象不可变;当你需要确保没有代码死锁而抛出异常,@synchronized(self)是个好的选择。
    自己的类:简单的解决方法是使用@synchronize,更好的方法是抛出一些断言来确保它的正确使用。现在肯定有线程安全的代码,一个很好的例子就是缓存类。一个好的方法是使用一个并行dispatch_queue为读/写锁,以最大限度地提高性能,并尝试只锁定那些真正需要的地方

  • GCD陷阱;递归锁,固定时序问题。

  • 线程安全与属性关键字:

  • 设计模式:代理;观察者;MVC,单例;工厂模式;

  • Gcd 它是苹果为多核的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核(比如双核、四核),最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,我们只需要告诉干什么就行。同时它使用的也是c语言,不过由于使用了 Block(Swift里叫做闭包),使得使用起来更加方便,而且灵活。
    GCD两种队列:
    串行队列和并行队列
    dispatch_queue_create
    串行:传入DISPATCH_QUEUE_SERIAL
    并行:传入DISPATCH_QUEUE_CONCURRENT
    两种执行方式
    同步sync和异步async

什么情况下使用:GCD在多核CPU上线程切换的时间比较短效率相对高些.NSOperation是建立在GCD之上的虽然使用起来比较复杂但是在线程并发管理优先级上有着GCD无法比拟的优势.

  • 代理,通知,block什么时候使用
  • Token怎么使用
  • 苹果推送机制原理
  • 开发中遇到的很难解决的问题,怎么解决的

  • 即时通讯
    Socket:实时性(监视和检测),断线重连,注销手动关闭。
    1.连接:全局单例数据共性,定时发送长连接(NSTimer)指令(指令与信息数据格式服务器来制定),没有收到服务器返回消息,得到失去连接的消息,在失去连接的回调方法中重新连接。
    2.断开与重连:两种可能枚举type:服务器掉线0;用户断开连接1(退出登录或程序退出);我们在cut前对socket的userData赋予一个值来标记为用户退出,这样我们可以在收到断开信息时判断究竟是什么原因导致的掉线。 实现代理方法掉线重连,用户断开不重连(return)。
    3.发送接收数据:socket发送数据是以栈的形式存放。先发送或接收长度,再接收数据。
    Xmpp:基于xml的协议,可以通过发送扩展的信息来处理用户需求,建立内容发布系统和基于地址的服务应用程序,包含了针对服务器端的软件协议。功能是用TCP传xml流。
    环信:消息构造,文字,图片,位置,语音视频文件,插入消息更新。
    会话:创建、删除、获取会话、未读消息数、
    解析:图片文字文件(缩略图自动下载)的远程路径,本地路径,长宽,下载状态。下载失败主动调用asyncFetchMessageThumbnail:progress方法主动获取。下载方法:同步方法,block回调方法,. IChatManagerDelegate异步方法。
    已读回执:收到的”已读回执”对象,包括 from, to, chatId等

  • APNS离线推送:1.后台上传了推送证书,2.代码配置APNS使用的推送证书registerSDKWithAppKey:apnsCertName3.代码注册离线推送(8.0).您注册了推送功能,iOS会自动回调以下方法,得到deviceToken,您需要将deviceToken传给SDK。
    获取全局APNS配置
    登录成功之后,sdk会自返回apns属性,
    设置APNS全局属性:配置apns免打扰时间,apns昵称,推送样式,EMPushNotificationOptions中的属性传入你想设置的值,调用以下方法即可。

  • Runtime:runtime是一套比较底层的纯C语言API,属于1个C语言库,包含了很多底层的C语言API。在我们平时编写的OC代码中,程序运行过程时,其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者
    比如说,下面一个创建对象的方法中
    runtime是属于OC的底层,可以进行一些非常底层的操作(用OC是无法现实的,不好实现)
    在程序运行过程中,动态创建一个类(比如KVO的底层实现).
    在程序运行过程中,动态地为某个类添加属性\方法,修改属性值\方法
    遍历一个类的所有成员变量(属性)\所有方法
    例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!
    runtime机制首先要了解下面几个问题
    1相关的头文件和函数
    1>头文件
    利用头文件,我们可以查看到runtime中的各个方法!
    2>相关应用
    NSCoding(归档和解档,利用runtime遍历模型对象的所有属性)
    字典 –>模型 (利用runtime遍历模型对象的所有属性,根据属性名从字典中取出对应的值,设置到模型的属性上)
    KVO(利用runtime动态产生一个类)
    用于封装框架(想怎么改就怎么改)
    这就是我们runtime机制的只要运用方向

写一个库,把JSON和model类型匹配:获取model每个属性的名字然后通过KVC赋值。获取每个属性就可以用objc_getAssociatedObject(object:key);

3>相关函数
objc_msgSend : 给对象发送消息
class_copyMethodList : 遍历某个类所有的方法
class_copyIvarList : 遍历某个类所有的成员变量
class_…..
这是我们学习runtime必须知道的函数!
4.必备常识
1> Ivar : 成员变量
2> Method : 成员方法
Runtime案例:动态添加属性,set方法objc_setAssociatedObject
,get方法objc_getAssociatedObject。3.替换或变更NSObject类方法Method
基本替换方法class_replaceMethod。

  • ReactiveCocoa的使用,它的特点等
  • 进程通信
    //调用另一个程序
    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@”http://www.baidu.com“]];
    初始化:
    //自定义初始化initWithName:

  • 单例:

    • 有哪些系统单例:
      UIApplication:应用程序单例
      NSNotificationCenter:通知中心单例
      NSUserDefaults:用户默认单例
      NSFileManager:文件管理单例
  • Arc:内存泄露的情况:
    1,循环参照
    A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
    这种问题常发生于把delegate声明为strong属性了。改正:strong->assign
    2,死循环
    如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。
    这种问题常发生于animation处理。
    .有时候需要用removeFromSuperView来释放:具体说明,也许我的a对象拥有一个b对象,b对象add到了c对象上,而在我们的设计中b对象的生命周期应该和a对象相同;这时候只一句[b release]/self.b = nil是不能把b对象释放掉的(一般情况下release会使其retainCount-1,[super dealloc]会再次将所有subView的retainCount-1,而b并不是a的subView,所有最后的一次-1没有了);所以我们需要在之前加上[b removeFromSuperView]。

  • 为一个类增加方法:继承,类目,延展.runtime动态给类添加方法

  • 地图使用(记得iOS8中配置配置项发生了变化,可以通过配置NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription来告诉用户使用定位服务的目的,并且注意这个配置是必须的
    如果没有授权则请求用户授权)

    • 定位服务中还包含CLGeocoder类用于处理地理编码和逆地理编码(又叫反地理编码)功能。
      地理编码:根据给定的位置(通常是地名)确定地理坐标(经、纬度)。
      逆地理编码:可以根据地理坐标(经、纬度)确定位置信息(街道、门牌等)。
      虽然很多第三方地图相比苹果原生地图更为开发者喜欢,但是苹果地图iOS10也许要向开发者开放接口
  • UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?
    组合模式composition,所有的container view都用了这个模式
    观察者模式observer,所有的UIResponder都用了这个模式。
    模板(Template)模式,所有datasource和delegate接口都是模板模式的典型应用

  • 做过的动画:首位动画 自定义界面跳转动画:(转场动画transform(翻转,缩放,) )
    核心动画:calayer包括:CABasicAnimation,配置动画组管理的基础动画CAAnimationGroup,CAKeyframeAnimation,

  • iOS11 新特性

  • 进程怎样进行通讯

    进程间通信主要包括管道,系统IPC(包括消息队列,信号量,共享存储), SOCKET.

C基础

//*(a+j)=a[j]

1.简述内存分区情况

(1)代码区:存放函数二进制代码
(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量
(3)堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
(4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数
block(全局类型存全局,还有保存在栈区(使用了block外的变量),堆区)

3.全局变量、静态全局变量、静态局部变量和局部变量的区别?

(1)按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
(2)按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。

4. new、delete、malloc、free关系

(1)他们都是在堆(heap)上进行动态的内存操作。
(2)new、delete用于C++中分配和释放内存,需要成对出现,注意他们只是操作符,不是函数,调用系统的构造函数和析构函数,new分配内存并初始化。
(3)malloc、free是C中用于分配内存和释放内存,也需要成对出现,并且malloc函数需要指定内存分配的字节数并且不能初始化对象,他们是是库函数。

4. static的作用?

(1)static修饰的函数是一个内部函数,只能在本文件中调用,其他文件不能调用。
(2)static修饰的全部变量是一个内部变量,只能在本文件中使用,其他文件不能使用。
(2)static修饰的局部变量只会初始化一次,并且在程序退出时才会回收内存。

5.关键字const什么含义?

const int a;
int const a;
const int *a;
int const *a;
int * const a;
int const * const a;
(1)前两个的作用是一样:a是一个常整型数
(2)第三、四个意味着 a是一个指向常整型数的指针(整型数是不可修改的,但指针可以)
(3)第五个的意思:a是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)
(4)最后一个意味着:a是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)

6. 请分别写出

常指针int * const a;
常量的指针,const int *a;
int const *a;
指针函数int *f(x,y);
函数指针 int (f) (int x); / 声明一个函数指针 */;

7.指针与地址的区别

(1)指针意味着已经有一个指针变量存在,他的值是一个地址,指针变量本身也存放在一个长度为四个字节的地址当中,而地址概念本身并不代表有任何变量存在。
(2)指针的值,如果没有限制,通常是可以变化的,也可以指向另外一个地址。地址表示内存空间的一个位置点,他是用来赋给指针的,地址本身是没有大小概念.

8.指针与数组名的关系

(1)数组可以申请在栈区和数据区;指针可以指向任意类型的内存块
(2)sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小
(3)数组名表示数组首地址,值不可以改变,如不可以将++作用于数组名上;普通指针的值可以改变,如可将++作用于指针上
(4)用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组

9.怎样防止指针越界使用的问题。

1、访问了一个已经被释放的对象-》使用前要判断非空,释放后要置空
2、访问数组类对象越界或插入了空对象-》使用数组时注意判断下标是否越界,插入对象前先判断该对象是否为空
3、访问了不存在的方法-》用 respondsToSelector方法先判断一下,然后再进行调用
4、堆栈溢出
5、多线程并发操作

10. 写出下面程序的运行结果

(tap4fun)
char str[][9] = {“hello”,”tap4fun”};
char * p = str[0];
printf(“%d”, strlen(p + 1));
结果:4

11.下列函数的输出结果

main()
{
int a[5]={1,2,3,4,5};
int ptr=(int )(&a+1);
printf(“%d,%d”,(a+1),(ptr-1));
}
答:2,5
(a+1)就是a[1],(ptr-1)就是a[4],执行结果是2.5
,&a+1是偏移了一个数组的大小;
则ptr实际是&(a[5]),也就是a+5

12. 以下为Windows NT下的32位C++程序,请计算sizeof的值

void Func ( char str[100] )
{
sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
sizeof( str ) 、sizeof ( p )都为4。

13.分别给出BOOL,int,float,指针变量与”零值”比较的if语句(假设变量名为var)

BOOL:if ( flag ) if (!flag )
int :if ( n == 0 ) if ( n != 0 )
float: const float EPSINON = 0.00001;其中EPSINON是允许的误差(即精度)。
if ((x >= - EPSINON) && (x <= EPSINON)
char *p: if(p==NULL) if(p!=NULL)
14. #define DOUBLE(x) x + x, i = 5* DOUBLE(5); i是多少?
30,
i = 5*5+5=30.
15.用预处理命令#define声明一个常数,表示一年中有多少秒(忽略闰年)?

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

这个表达式将使一个16位机的整型数溢出,因此要用到长整型符号L,告诉编译器这个常数是的长整型数。的表达式中用到UL(表示无符号长整型,没有负值)
16.用宏定义交换两个数。
#define CHANGE(x, y) x^=y^=x^=y (只能对int,char)
使用中间变量:
temp= a; a = b; b = temp;
17.预处理命令中的宏一般有哪两种常用的用法,请写一个“标准”宏MIN,输入两个参数并返回较小的一个。
带参?无参
#define MIN(a,b) ((a)>(b))?(b):(a)

18.方法可以作为参数吗,如何实现?

可以。函数名其实是函数指针,能用指针的地方就能用函数指针。
这里f1的原型应该是这样的才对
void f1(int (*f2)()) //f2 是一个函数指针
{
f2();
}

19. do-while 与while-do的区别?

OC基础

  • 1.对面向对象编程的理解
  • 2.面向对象有哪些特点?简要叙述一下这几个特点
    面向对象程序设计中的类有三大特性:继承,封装,多态
    封装:@public,@protected,@private,@package

    1. obj-c的优缺点
      objc优点:
      (1)Cateogies
      (2)Posing
      (3)动态识别
      (4)指标计算
      (5)弹性讯息传递
      (6)不是一个过度复杂的 C衍生语言
      (7) Objective-C与 C++可混合编程
      缺点:
      (1)不支援命名空間
      (2)不支持运算符重载
      (3)不支持多重继承
      (4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
    1. #import 跟#include、@class有什么区别?#import<>跟 #import””又什么区别?
      c/c++头文件的导入#include

    import比起#include的好处就是不会引起交叉编译

需要用到引用类的内部的实体变量和方法/包含全部信息->#import
备注:#import就是把被引用类的头文件走一遍,即把.h文件里的变量和方法包含进来一次,且仅一次,而@class不用,所以后者编译效率更高。
只需要知道被引用的类名,不需要知道具体内部方法/在编译效率方面考虑:多个头文件引用同一个文件->@class:编译效率更高,用@class:声明名称是类名。循环依赖时用@class互相声明;

备注:实践证明,A,B相互#import不会出现编译错误。因为<标记>处已经说明#import时文件只被导入一次,所以此条不成立。

总结:
1.如果不是c/c++,尽量用#import。Oc文件导入头文件:#import:只导入一次,在递归包含中不会出错。
2. 能在实现文件中#import,就不在头文件中#import。
3. 能在头文件中@class+实现文件中#import,就不在头文件中#import。

  1. 现有一个变量NSArray *list,请描述&list、*list和**list的区别?
    &list:数组首地址:list[0]的地址。
    *list:数组首地址内容
    **list:数组首地址的地址(指向指针的指针)
    6.常见的object-c的数据类型有那些,和C的基本数据类型有什么区别?
    bjective-C数据类型可以分为:基本数据类型、对象类型和id类型。基本数据类型有:int、float、double和char类型。对象类型就是类或协议所声明的指针类型,例如:NSAutoreleasePool * pool,其中NSAutoreleasePool是一个类,NSAutoreleasePool *是它指针类型。id类型可以表示任何类型,一般只是表示对象类型,不表示基本数据类型。
    常用OC类型:NSString、NSArray、NSDictionary、NSData、NSNumber等
    OC对象需要手动管理内存,C的基本数据类型不需要管理内存
    NSInteger是基础类型,但是NSNumber是一个类。如果想要在NSMutableArray里存储一个数值,直接用NSInteger是不行的,
  2. 给你一个字符串helloword在hello后面插入my
  3. What are mutable and immutable types in Objective C?
    obc中可修改和不可以修改类型。
    1.mutable是可变类型,比如NSMutableArray,可以动态往里面添加元素
    immutable是不可变类型,比如NSArray,固定的存储空间,不能添加元素
    //可变数组类型,没有返回值 [array4 removeObject:@”23”];

去重复:
NSArray *array = @[@”2”,@”1”,@”2”,@”4”,@”2”,nil];
NSSet *a = [NSSet setWithObjects:array];
NSArray *newArray = [a allObjects];
9. Object-C有私有方法吗?私有变量呢?
OC没有类似@private的修饰词来修饰方法,只要写在.h文件中,就是公共方法
可以使用类扩展(Extension)来增加私有方法和私有变量
编译时是NSString类型,运行时是NSData类型。
10. id、nil代表什么?
id类型的指针可以指向任何OC对象
nil代表空值(空指针的值, 0)
11. id表示什么类型?id呢?
12. Polymorphism?
关于多态性
多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,
因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
最重要的是转化成自我理解。
13. 对于语句NSString*obj = [[NSData alloc] init];,编译时和运行时obj分别是什么类型?
14. 类变量的@protected ,@private,@public,@package声明各有什么含义?()
15.谈谈你对成员变量与属性的理解?
assign retain 声明属性,就算声明了成员变量(带_的),自动合成属性。strong,retain :对象类型 assign: 缺省值,修饰一般基本数据类型、delegate copy:对象类型,(遵守了协议) 区别:1.属性可以不写set,get方法就可以直接使用点语法,而成员变量要使用点语法要写set,get方法。 2.调用的时候属性默认生成set,get方法。3.属性会自动生成私有成员变量(名称为:下划线+属性名)3.在类使用时,属性self.x会给私有的x变量增加一次引用计数,相当于多retain一次。优缺点:在外部调用时,属性更为方便,内部调用通常使用成员变量。

pragma mark-4总结放在.m文件和.h文件的区别 属性在.h文件中和在.m中声明是有区别的。区别就是,在.h文件中声明的属性,外部类可以通过“类实例.属性”来调用,但在.m中声明的则不可以,获取和设置的方法,只能是通过setValue:forKey和valueForKey来实现。 成员变量,有三种权限,@private、@protected、@public,写在.m文件中时,相当于是@private权限,子类无法访问,验证了一下,做权限修改也无效。而写在.h文件中,默认是@protected权限,子类可以访问,可以做权限修改。 写在.h中的是公用的,可以直接调用,也可以通过KVC调用,.m中的是私有的,外部类无法调用到.m中的参数。

1.以前,我们同时声明了属性和底层实例变量。属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量。2.当苹果默认编译器转换后,从此不再需要为属性声明实例变量了。如果LLVM发现一个没有匹配实例变量的属性,它将自动创建一个以下划线开头的实例变量。用下划线和 self.点出来是一样的。其实是调用的myButton属性的getter/setter方法。
当使用成员变量时,self.使用是错误的,需要用->
注意:类别中添加属性(其实是添加的getter与setter方法),是不会自动生成实例变量量的,
属性可以用dot(.)语法,比如self.xxx,在外部调用也同样可以someClass.xxx。

属性实际上是对一组set和get方法的简单封装(oc的get方法没有get前缀),同样会自动生成一个私有的成员变量(名称为:下划线+属性名)。

成员变量无论是全局还是局部的,都只能在本类或当前函数中使用,在其之外的地方无法直接调用(可以通过间接的方式调用)。

一些建议:
1.如果只是单纯的private变量,最好声明在implementation里.
2.如果是类的public属性,就用property写在.h文件里
3.如果自己内部需要setter和getter来实现一些东西,就在.m文件的类目里用property来声明

16.定义一个类的私有访问属性(该属性只能在类中使用,外部无法访问)

  1. NSMutabDictionary 的setValueForKey和setObjectForKey的区别
  2. IOS中有gbk吗,是怎么实现的
    gbk字符串编码转换,如果网页是gbk(或者gb2312),用UTF8转换的话,pageSource返回nil。这时需要使用gbk编码做转换,
//转换成UTF-8
 datastringByAddingPercentEscapesUsingEncoding
  //UTF-8转GBK
dataUTF8stringByReplacingPercentEscapesUsingEncoding
  1. iOS里面是否有GBK的字符编码描述?即NSUTF8StringEncoding这样的描述?如果有,是怎样的?
    发现NSString类中有内置的方法可以实现。他们分别是:
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
  只要传入相应的编码即可以进行编码和解码了,不过此方法是对整个Url进行编码的所以如果有Query String中带有&?/等是不会进行编码转换的,如果

20. IOS中有二进制吗,与NSSting是怎么转换的

21.在iOS中二进制数用什么类型表示?与NSString如何转换?
NSData ;

NSString *s=[[NSMutableString alloc] initWithData:self.receiveDataencoding:NSUTF8StringEncoding];


  1. iOS是否有NSUTF8StringEncoding?作用是什么?
    23.什么是反射,具体应用在哪?

系统Foundation框架为我们提供了一些方法反射的API,我们可以通过这些API执行将字符串转为SEL等操作.
假设有一天公司产品要实现一个需求:根据后台推送过来的数据,进行动态页面跳转,跳转到页面后根据返回到数据执行对应的操作。
应用场景

  • When we call objective c is runtime language what does it mean?
    我们说的obc是动态运行时语言是什么意思?
    多态。主要是将数据类型的确定由编译时,推迟到了运行时。
    这个问题其实浅涉及到两个概念,运行时和多态。
    简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
    多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
    那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
    也就是不同的对象以自己的方式响应了相同的
    内存管理
    Objective-C提供了几种内存管理方式?请详细举例谈谈你对Objective-C的内存管理策略的理解
    • 手动管理MRC(引用计数)
    • 自动管理(编译器自动在合适的地方插入retain/release)
  • pragma mark-集合内存管理:字典,数组
        /* 
         1。对象加入集合中,retainCOunt+1;
         2.集合对象的retainCount改变了,其中的元素的retainCount不变
         3.对象从集合对象中移除,retainCount-1、
         4.集合对象销毁,其中所有的元素进行release一次
         */
    
    1. Objective-C如何对内存管理的,说说你的看法和解决方法?在和property结合的时候怎样有效的避免内存泄露?
      (1)普通情况下的内存管理(通过引用计数)每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器为0时,就会被销毁。
      (2)通过retain可以让对象的计数器+1、release可以让对象的计数器-1。
      (3)还可以通过autorelease pool管理内存
      (4)如果用ARC,编译器会自动生成管理内存的代码

    @property如果用了copy或者retian,就需要对不再使用的属性做一次release操作
    避免内存泄露:
    1. arc
    2.如果不能用arc,那么用shift+command+B来做Analyze,帮你找出各种内存漏洞。在给一个对象分配内存的时候就写下释放此对象的代码,返回给别的方法的对象使用自动释放;
    3. Instrument调试(运行时泄露)Product->Profile->

    3.内存管理的几条原则时什么?按照默认法则.哪些方法生成的对象需要手动释放?
    (1)如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥
    有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new时也同样适用.
    (2)如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。
    (3)如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。
    (4)如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数
    的例外,在参考文档中有显式的说明)。
    或则:
    (1)只要调用了alloc、copy、new方法产生了一个新对象,都必须在最后调用一次release或者autorelease。
    (2)只要调用了retain,都必须在最后调用一次release或者autorelease。

    1. ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
      (1)alloc与dealloc语意相反,alloc是创建变量,dealloc是释放变量(//dealloc只是减一 不是销毁)。
      (2)retain对应release,retain保留一个对象。调用之后,对象的引用计数加1。例如:
      • (void) setName : (NSString*) name {
        [name retain];
        [myname release];
        myname = name; }
        我们来解释一下:设想,用户在调用这个函数的时候,他注意了内存的管理,所以他小心的写了如下代码:
        NSString * newname = [[NSString alloc] initWithString: @”John”];
        [aClass setName: newname];
        [newname release];
        我们来看一看newname的计数是怎么变化的。首先,它被alloc,count = 1;然后,在setName中,它被retain,count = 2;最后,用户自己释放newname,count = 1,myname指向了newname。这也解释了为什么需要调用[myname release]。我们需要在给myname赋新值的时候,释放掉以前旧的变量。retain之后直接dealloc对象计数器没有释放。alloc需要与release配对使用,因为alloc这个函数调用之后,变量的计数加1。所以在调用alloc之后,一定要调用对应的release。另外,在release一个变量之后,他的值仍然有效,所以最好是后面紧接着再var = nil。
        5.对象是什么时候被释放的?
        每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁
        悬垂指针,内存已经回收了,但是指针还在,感觉内存空间还在那,retainCount作为一个参考,不能进行逻辑运算
    2. 什么是retain count?
      7.类方法创建的对象要不要用release释放?
      8.自动释放池是什么,如何工作
      当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
      1.ojc-c是通过一种”referring counting”(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.

    3. NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.

    4. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.

    5. autorelease的对象是在什么时候被release的?
      autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。对于每一个Runloop,系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。那什么是一个Runloop呢?一个UI事件,Timer call, delegate call,都会是一个新的Runloop。那什么是一个Runloop呢?一个UI事件,Timer call, delegate call,都会是一个新的Runloop.
    6. How many autoreleasepool you can create in your application? Is there any limit?
    7. 自动释放池跟GC(垃圾回收)有什么区别?iPhone上有GC么?[pool release]和[pool drain]有什么区别?
      iPhone上没有GC。iPhone开发的时候没有垃圾回收机制。
      在垃圾回收环境中,release是一个空操作。因此,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。因此,在通常情况下,您应该使用drain而不是release来销毁自动释放池。
    8. Is there any garbage collection mechanism in Objective C.?
      OBC的垃圾回收机制?
      OBC2.0有Garbage collection,但是iOS平台不提供。
      一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。
      但是差了大部分资料,貌似不要和arc机制搞混就好了
      13.谈谈你对ARC的认识和理解?/什么是ARC,其优点如何,ARC如何工作?
      14.什么是安全释放
      15.强引用与弱引用在ARC中分别是在什么阶段释放?
    9. 什么时候使用__strong和 strong?什么时候使用 __weak和weak?什么时候使用 __autoreleasing?什么时候使用 __unsafe_unretained
    10. property中有哪些主要属性参数,请谈谈分别在什么情况下使用?
    11. 属性关键字readwrite,readonly,assign,retain,copy,atomic,nonatomic各是什么作用,在哪种种情况下用?
      readwrite:同时生成get方法和set方法的声明和实现。
      readonly:只生成get方法的声明和实现。
      assign:set方法的实现是直接赋值,用于基本数据类型。
      retain:set方法的实现是release旧值,retain新值,用于OC对象类型。

    copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型。
    atomic:原子性,getter和setter是原子操作,在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。
    nonatomic:非原子性,getter和setter方法的实现不加锁(比atomic性能高)。

    ========================内存管理有关=================================
    strong,retain :对象类型
    assign: 缺省值,修饰一般基本数据类型、delegate
    copy:对象类型,(遵守了协议)
    不保留对象时,将对象设置为assign
    ========================线程有关=================================
    atomic:关心线程安全,通常用于多线程
    nonatomic:不关心线程安全,通常用于单线程
    ==================
    strong=retain;
    weak=assign;
    readonly(getter,不提供set方法)
    ==================点语法===============
    “=”左侧相当于调用setter,右侧相当于调用getter
    点语法优先级很高,可以进行自加自减

    ==================copy===============
    使用copy,该对象遵守你的协议

    //结论:copy对于可变的对象,内容复制(深复制),复制过后的新地址存的值是不可变的。
    ///////*
    深复制:对象复制,编译器会开辟一个新的内存空间来存储对象的数据,复制后的对象retainCount置为1,需要手动释放内存。
    浅复制:指针复制,只是引用计数+1,需要手动释放内存

    copy:如果对于不可变的对象是浅复制,如果对于可变的对象就是深复制,且浅复制的对象不可变

    对于mutableCopy无论是可变对象,还是不可变对象,都是内容复制,(深复制),新复制的对象(值)是可变的
    */

    1. 属性关键字strong、weak、assign、retain之间的区别
      管理内存:

    20.避免循环应用的属性是?
    21. Weak和strong的区别

    1. 写一个setter方法用于完成@property(nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name.
      @property (nonatomic, retain) NSString *name;
      • (void)setName:(NSString *)name
        {
        if (_name != name) {
        [_name release];
        _name = [name retain];
        }
        }
        @property(nonatomic, copy) NSString *name;
      • (void)setName:(NSString *)name
        {
        if (_name != name) {
        [_name release];
        _name = [name copy];
        }
        }
    2. self.跟self->什么区别?
      self.是调用get方法或者set放
      self是当前本身,是一个指向当前对象的指针
      self->是直接访问成员变量

    3. 为什么很多内置的类,如TableView的delegate的属性是assign不是retain?
      (1)tableView的代理一般都是它所属的控制器,控制器会对它内部的view做一次retain操作
      (2)假设tableView也对代理(控制器)做一次retain操作,那么就出现循环retain问题

    4. Difference between shallow copy and deep copy?
      浅复制和深复制的区别?
      (1)浅拷贝:指针(地址)拷贝,不会产生新对象
      (2)深拷贝:内容拷贝,会产生新对象
    5. copy与mutablecopy的区别?
      27.一个人,有一本书,这本书要给一个人,问,怎么具体实现管理内存
      28.在一个对象的方法里面:
      self.name = @”object”和name = @”object”有什么不同?
      29.请说出以下代码中的错误
      @interface Person:NSObject
      @property(nonautomic, retain) int age;
      @end
      @implementation Person
      • (void)setAge:(int)newAge
        {
        self.age = newAge;
        }
        @end
        30.这段代码有什么问题,如何修改
        for (int i = 0; i < someLargeNumber; i++)
        {
        NSString *string = @”Abc”;
        string = [string lowercaseString];
        string = [string stringByAppendingString:@”xyz”];
        NSLog(@“%@”, string);
        }
        31.看下面的程序,三次NSLog会输出什么?为什么?
        NSMutableArray* ary = [[NSMutableArray array] retain];
        NSString *str = [NSString stringWithFormat:@”test”]; // 1
        [str retain]; // 2
        [ary addObject:str]; // 3
        NSLog(@”%d”, [str retainCount]);
        [str retain]; // 4
        [str release]; // 3
        [str release]; // 2
        NSLog(@”%d”, [str retainCount]);
        [ary removeAllObjects]; // 1
        NSLog(@”%d”, [str retainCount]);
        结果:3、2、1
        32.下列函数的输出结果
      • (void)getNSString(const NSString inputString)
        { inputString = @”This is a main test\n”;
        return ;}
        -main(void)
        {NSString *a=@”Main”;
        NSString *aString = [NSString stringWithString:@”%@”,getNSString(a)];
        NSLog(@”%@\n”, aString);}
        最后输出的字符串:NULL,output在函数返回后,内存已经被释放。
    6. for(int index = 0; index < 20; index ++){
      NSString *tempStr = @”tempStr”;
      NSLog(tempStr);
      NSNumber *tempNumber = [NSNumber numberWithInt:2];
      NSLog(tempNumber);
      }
      这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?
      类别、分类、继承、协议
      1.Objective C中的category是什么?
      Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category)。类别用于对一个已经存在的类添加方法(Methods)。你只需要知道这个类的公开接口,不需要知道类的源代码。需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables)。
      子类(subclassing)是进行类扩展的另一种常用方法。与子类相比,类别最主要的优点是:系统中已经存在的类可以不需修改就可使用类别的扩展功能。
      类别的第二大优点是实现了功能的局部化封装。类别定义可以放在一个已存在的类(类A)的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。如果另一个类(类B)不需要用到类A的功能(没有包含类A的.h文件),也就不会看到依附类A存在的类别。iOS SDK中广泛运用这种类别定义法来封装功能。
      2.What is advantage of categories? What is difference between implementing a category and inheritance?
      类别的作用?继承和类别在实现中有何区别?
      类目:
      category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
      并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
      类别主要有3个作用:
      (1)将类的实现分散到多个不同文件或多个不同框架中。
      (2)创建对私有方法的前向引用。
      (3)向对象添加非正式协议。
      //定义方法名的时候,不要和原有的方法同名,一旦同名,走的是Category类目(类别)方法
      继承可以增加,修改或者删除方法,并且可以增加实例变量。
      3.Difference between categories and extensions?
      类别和类扩展的区别。
      (1)category和extensions的不同在于后者可以添加实例变量。
      (2)extensions添加的方法是必须要实现的,且外界不可见,本类调用。
      (3)
      extensions可以认为是一个私有的Category,添加的方法和实例变量私有的。
      //=====延展主要是为相应的类添加其私有属性,以及私有方法、成员变量.在.m中加上@interface

    //类别:可以添加方法,属性,不可以添加成员变量
    注意:匿名类别(匿名扩展)是可以添加实例变量的,非匿名类别是不能添加实例变量的,只能添加方法,或者属性(其实也是方法)
    4. Category的作用和使用限制
    5. Objective C中的protocal是什么?
    @protocal obj里面的协议就如同java里面的interface。
    委托人:
    制定协议名称,协议方法(在@interface之前)
    @protocol CustomDelegate //CustomDelegate自己定义协议的名字
    -(void)buyIphone:(NSString *)iphoneType;

    设置代理指针:
    @property (nonatomic,assign)id delegate;
    -(void)willBuy;
    代理人:
    //遵守协议
    -(void)buyIphone:(NSString *)iphoneType; //遵守协议里面的方法,并实现
    Protocl协议.h文件:
    //(可选或必须的)方法列表 协议内容 (默认)必须遵守
    -(void)buyIphoneType:(NSString *)iphoneType;// 协议中要做的方法

    1. 协议中的@required、@optional表示什么?
    2. Difference between protocol in objective c and interfaces in java?
      obc中的协议和java中的接口概念有何不同?
      OBC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。
      informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
      其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
      “非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
      这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
      这么看,总觉得类别这玩意儿有点像协议的可选协议。”
      现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,
      现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。
      java中的接口必须都实现。
    3. Object-c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?
      Objective-c只支持单继承,如果要实现多继承的话,可以通过类目和协议的方式来实现,cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的。
      为其(已有的类)添加(公有)方法.

    9.为一个类添加一个方法有哪些方法?类目、协议、继承
    10.不用UI只用协议实现按钮点击事件
    KVC、KVO、通知、代理、block、单例
    1. What are KVO and KVC? kvc是什么?kvo是什么?有什么特性?
    kvc:键 -值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,或通过实例变量访问的机制。
    很多情况下可以简化程序代码。根据keypath去取的到相应的值
    kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

    具体用到过的一个地方是对于按钮点击变化状态的的监控。
    比如我自定义的一个button。
    [self addObserver:self forKeyPath:@”highlighted” options:0 context:nil];

    • (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void *)context
      {
      if ([keyPath isEqualToString:@”highlighted”] ) {
      [self setNeedsDisplay];
      }
      }
      对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
      对于kvc机制如何通过key寻找到value:
      “当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有someKey这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。

    (cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
    设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“
    来至cocoa,这个说法应该挺有道理。
    因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
    可以按照kvc查找的逻辑理解,就说的过去了。
    2.什么是键-值,键路径是什么?
    模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
    键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的
    性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型
    实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相
    关对象的特定属性。
    3. 什么是Notification?简述Notification的工作机制和使用方法?
    观察者模式,controller向defaultNotificationCenter添加自己的notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload跟dealloc中都要注销)。
    代理、通知、KVO区别?
    delegate 的 优势 :
    1.非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义。
    2.如果delegate中的一个方法没有实现那么就会出现编译警告/错误
    3.协议必须在controller的作用域范围内定义
    4.在一个应用中的控制流程是可跟踪的并且是可识别的;
    5.在一个控制器中可以定义定义多个不同的协议,每个协议有不同的delegates
    6.没有第三方对象要求保持/监视通信过程。
    7.能够接收调用的协议方法的返回值。这意味着delegate能够提供反馈信息给controller
    缺点 :
    1.需要定义很多代码:1.协议定义;2.controller的delegate属性;3.在delegate本身中实现delegate方法定义
    2.在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash
    3.在一个controller中有多个delegate对象,并且delegate是遵守同一个协议,但还是很难告诉多个对象同一个事件,不过有可能。
    notification的优势:
    1.不需要编写多少代码,实现比较简单;
    2.对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单
    3.controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
    缺点:
    1.在编译期不会检查通知是否能够被观察者正确的处理;
    2.在释放注册的对象时,需要在通知中心取消注册;
    3.在调试的时候应用的工作以及控制过程难跟踪;
    4.需要第三方对喜爱那个来管理controller与观察者对象之间的联系;
    5.controller和观察者需要提前知道通知名称、UserInfodictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;
    6.通知发出后,controller不能从观察者获得任何的反馈信息。
    KVO的优势:
    1.能够提供一种简单的方法实现两个对象间的同步。例如:model和view之间同步;
    2.能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现;
    3.能够提供观察的属性的最新值以及先前值;
    4.用key paths来观察属性,因此也可以观察嵌套对象;
    5.完成了对观察对象的抽象,因为不需要额外的代码来允许观察值能够被观察
    缺点:
    1.我们观察的属性必须使用strings来定义。因此在编译器不会出现警告以及检查;
    2.对属性重构将导致我们的观察代码不再可用;
    3.复杂的“IF”语句要求对象正在观察多个值。这是因为所有的观察代码通过一个方法来指向;
    4.当释放观察者时不需要移除观察者。

    5.在一个对象释放前.如果他被加到了notificationCenter中.不在notificationcenter中remove这个对象可能会出现什么问题?
    6.notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢?
    7. 什么是委托(Delegate)?何为观察者(Observer)模式?
    8.委托是什么?委托的property声明用什么属性?为什么?
    9. What is purpose of delegates?
    代理的作用?
    代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
    另外一点,代理可以理解为java中的回调监听机制的一种类似。
    10.delegate和Notification的区别,分别在什么时候使用?
    delegate针对one-to-one关系,并且reciever可以返回值给sender,notification可以针对one-to-one/many/none,reciever无法返回值给sender.所以,delegate用于sender希望接受到reciever的某个功能反馈值,notification用于通知多个object某个事件。
    11.手写一个代理,并实现代理方法.
    12.如何通过代理传值
    13. iOS中的block有什么用,定义一个名为maxBlock的block变量,输入两个整型参数,返回较大的那个。
    函数很相似:1.保存代码,2.调用方式一样,3,可以作为函数参数或返回值类型
    //相同作用域&&基本数据类型,block直接复制,不能修改局部变量
    typedef int(^Myblock)(int,int);

    1. What is Singleton?
      对于单例的理解
      单例是生命周期与程序生命周期相同,仅能生成一次、且不能被销毁的唯一实例;
      需要确保应用中的一个特定类有且仅有一个实例(对象);
      单例可在程序任何位置被访问,且一直存在;
      单例实例获取方法命名规则:一般以standard…、shared…、default….开头;
      单例必须至少满足以下条件:
      只初始化一次;
      全局存在;
      唯一,对象不可改;
      方便获取,任何位置可访问

    保证程序运行过程中,永远只有一个对象实例
    目的是:全局共享一份资源、节省不必要的内存开销
    15.系统有哪些单例,把你知道的都写出来,然后手写一个单例(单例名称,成员变量自己定义)。
    方法1:一般创建

    #import "Singleton.h"  //静态变量保证单例对象始终存在
     static Singleton *singleton =nil;
      @implementationSingleton  
    + (instancetype)defaultSingleton {      // 仅在单例对象为空时初始化一次,之后直接返回唯一的单例对象   
      if (singleton ==nil) {   
    singleton = [[Singleton alloc] init];    
     }     return singleton;
     }
      @end

    方法2:GCD
    创建(推荐使用)

    import "Singleton.h" 
     static Singleton *singleton =nil; 
     @implementationSingleton  
    + (instancetype)defaultSingleton {    
      static dispatch_once_t onceToken;    
      dispatch_once(&onceToken, ^{       
      singleton = [[Singleton alloc] init];  
       });     return singleton;  } 
     @end 

    自定义单例创建完整方法
    一般创建单例方法可能会出现一些问题,我们通过不同的途径得到不同的对象,显然是不行的。我们必须要确保对象的唯一性,所以我们就需要封锁用户通过alloc/init/copy以及release/retain等方法来构造或操作对象这条道路。
    我们知道,创建对象的步骤分为申请内存(alloc)、初始化(init)这两个步骤,我们要确保对象的唯一性,因此在第一步这个阶段我们就要拦截它。当我们调用alloc方法时,oc内部会调用allocWithZone这个方法来申请内存,我们覆写这个方法,然后在这个方法中调用defaultSingleton方法返回单例对象,这样就可以达到我们的目的。拷贝对象也是同样的原理,覆写copyWithZone方法,注意需遵守协议,然后在这个方法中调用defaultSingleton方法返回单例对象,其他示例直接参考如下代码:

    static Singleton *singleton =nil;  + (instancetype)defaultSingleton {     if (!singleton)
     {         singleton = [[Singleton alloc] init];  
       }    
     return singleton; } 
     // alloc + (instancetype)allocWithZone:(struct _NSZone *)zone {     
         @synchronized(self) {      
            singleton = [super allocWithZone:zone];          
           return singleton;     
               }     
    } 
     // copy - (id)copyWithZone:(NSZone *)zone 
     { 
        returnself; 
        }
      // retain 
      - (instancetype)retain
       {    
       return self;  
       } 
     // release 
      - (oneway void)release {
        }  
    // autorelease  
    - (instancetype)autorelease  
     {    return 
     self;  
     } 
     // retainCount  
     - (NSUInteger)retainCount  
     {    return  
     NSUIntegerMax;  
     }

    16.页面间传值有哪几种方式
    属性,通知,代理,协议(返回之前的视图),block,单例
    17. iOS中的回调方法方法有哪些,说说你的理解?
    Block 代理 通知 单例
    UI
    1.阐述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时所经历的生命周期.
    2. 请写出UIViewController的生命周期,谈谈你对UIViewController和UIView的理解(任何方面均可)
    3. ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?
    loadView

    当第一次使用控制器的view时,会调用loadView方法创建view,一般在这里自定义view。

    viewDidLoad

    当控制器的view创建完毕时会调用,也就是在loadView后调用,一般在这里添加子控件、初始化数据。

    viewDidUnload

    当控制器的view因为内存警告被销毁时调用,一般在这里回收跟界面相关的资源(iOS7中该方法已经被舍弃)。

    4 .ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?

    当应用程序接收到系统的内容警告时,就有可能调用控制器的didRece…Warning方法
    它的默认做法是:
    当控制器的view不在窗口上显示时,就会直接销毁,并且调用viewDidUnload方法

    5 . frame,bounds,center的区别。iPhone中获取屏幕尺寸的方法
    frame以父控件的左上角为坐标原点
    bounds以控件本身的左上角为坐标原点
    1.app尺寸,去掉状态栏
    CGRect r = [ UIScreen mainScreen ].applicationFrame;
    r=0,20,320,460
    2.屏幕尺寸
    CGRect rx = [ UIScreen mainScreen ].bounds;
    r=0,0,320,480
    3.状态栏尺寸
    CGRect rect; rect = [[UIApplication sharedApplication] statusBarFrame];
    6. Can we use two tableview controllers on one viewcontroller?
    是否在一个视图控制器中嵌入两个tableview控制器?
    一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
    只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,
    而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController
    那样的感觉。

    7 . UITableViewController 中,创建UITableViewCell时,initWithSytle:resuseIdentifier中,reuseIdentifier有什么用?简述UITableViewCell的复用原理.
    复用队列的元素增加:只有在cell被滑动出界面的时候,此cell才会被加入到复用队列中。每次在创建cell的时候,程序会首先通过调用dequeueReusableCellWithIdentifier:cellType方法,到复用队列中去寻找标示符为“cellType”的cell,如果找不到,返回nil,然后程序去通过调用[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]来创建标示符为“cellType”的cell。

    8 . tableview的cell的重用机制

    为了做到显示和数据分离,IOS tableView的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的。
    队列。

    9 . UITableView的DataSource和Delegate的区别与联系

    10 . Can we use one tableview with two different datasources? How you will achieve this?
    一个tableView是否可以关联两个不同的数据源?你会怎么处理?
    首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。
    因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。
    因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

    11.写出Cell动态指定高度的思路和注意事项

    12.上拉刷新是什么原理?内部怎么实现?/如何实现滚动到底部自动加载,以及显示一个loading cell?

    13 UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?
    模板(Template)模式,所有datasource和delegate接口都是模板模式的典型应用,
    组合模式composition,所有的container view都用了这个模式
    观察者模式observer,所有的UIResponder都用了这个模式。

    14.描述两种隐藏UI视图的方式,哪一个你认为是最好的?

    15 . UIView 和CALayer有什么区别?

    两者最大的区别是,CALayer图层不会直接渲染到屏幕上。
    Uiview相当于calayer的管理者,处理接受事件(calyer不能处理事件,不能直接渲染,是通过uiview渲染),view添加子图层是加到calayer上

    1 UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等,实际上内部都是在访问它所包含的CALayer的相关属性。

    2 UIView有个重要属性layer,可以返回它的主CALayer实例。
    // 要访问层,读取UIView实例的layer属性
    CALayer *layer = myView.layer
    所有从UIView继承来的对象都继承了这个属性。这意味着你可以转换、缩放、旋转,甚至可以在Navigation bars,Tables,Text boxes等其它的View类上增加动画。每个UIView都有一个层,控制着各自的内容最终被显示在屏幕上的方式。
    UIView的layerClass方法,可以返回主layer所使用的类,UIView的子类可以通过重载这个方法,来让UIView使用不同的CALayer来显示。代码示例:

        - (class)layerClass {
           return ([CAEAGLLayer class]);
        }
    

    上述代码使得某个UIView的子类使用GL来进行绘制。
    3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。示例代码:
    grayCover = [[CALayer alloc] init];
    grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
    [self.layer addSubLayer:grayCover];
    上述代码会在目标View上敷上一层黑色透明薄膜的效果。
    4. UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。
    5.动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。
    6.坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属性,使用CGPoint结构表示,值域是0~1,是个比例值。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
    某layer.anchorPoint = CGPointMake(0.f,0.f);
    如果这么设置,只会将layer的左上角被挪到原来的中间位置,必须加上这一句:
    某layer.position = CGPointMake(0.f,0.f);
    最后:layer可以设置圆角显示(cornerRadius),也可以设置阴影 (shadowColor)。但是如果layer树中某个layer设置了圆角,树种所有layer的阴影效果都将不显示了。因此若是要有圆角又要阴影,变通方法只能做两个重叠的UIView,一个的layer显示圆角,一个layer显示阴影……
    7.渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。
    [gameLayer setNeedsDisplay];
    若要重绘部分屏幕区域,请使用setNeedsDisplayInRect:方法,通过在CGRect结构的区域更新:
    [gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];
    如果是用的Core Graphics框架来执行渲染的话,可以直接渲染Core Graphics的内容。用renderInContext:来做这个事。
    [gameLayer renderInContext:UIGraphicsGetCurrentContext()];
    8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。
    characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);

        CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
        backgroundView.layer.affineTransform = transform;
    

    9.变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供了一些魔术般的变换效果。

    16.在原来的view上重新绘制这个页面用什么方法
    17. ios的UIView重新绘制视图需要调用什么方法?
    18.是否使用过Graphic,它有哪些功能?
    19. UINavigationController的实现机制
    20. UINavigationController要实现push/pop要如何操作?
    21. 谈谈viewController的页面跳转方式
    22.一个label上有多个颜色,要怎么写?
    23.做界面的工具是什么(storyboard那个),内部是怎么实现的
    24. xib没有自适应?xib有没有缺点
    25. iOS里面用于画界面的工具叫什么,其内部是如何实现的?
    26. 现在有n个UIButton,每个UIButton的宽、高均为80px,UIButton之间的水平、垂直间距分别为10px、20px,请把这n个UIButton布局到一个宽度为W(至少大于80px)的UIView上。
    27. 在loadView里,设置navigation item返回按钮

            - (void)loadView
            {
             UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
             [rightButton setTitle:@”返回” forState:UIControlStateNormal];
             [rightButton addTarget:self action:@selector(OnReturn:) forControlEvents:UIControlStateNormal];
             UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
            [self.navigationItem setRightBarButtonItem:buttonItem];
            [buttonItem release];
            [rightButton release];
            }
    

    //点击“返回”按钮,弹出view controller

            - (void)OnReturn:(id)sender
            {
             [self.navigationController popViewControllerAnimated:NO];
            }
    

    以上代码执行后会产生什么结果并阐述原因?
    (vc=UIViewController)vc用nav包装,通过push跳转,A vc->B vc,请问(1)Bvc init之后对其navBarItem上面的一个lable进行赋值,bvc.title.text = @”ss”,然后push ( 2 )Bvc init之后,push,然后赋值;请问那种是正确的,请问为什么?
    现在改成,Bvc有一个NSString属性 sText,,用sText去设置该lable的text①现在是sText=@”ss”赋值,赋值结束之后,然后push,②push,之后赋值;请问那种正确?为什么?(赋值是在viewDidLoad里面)
    28.对于navbar完全自定义你怎么设计?
    继承appearance都可以改颜色:[[UINavigationBarappearance]setTintColor:[UIColorwhiteColor]];
    navBar的方法:颜色,背景色,文字的设置。
    UIBarButtonItem *itemm = [UIBarButtonItemappearanceWhenContainedIn:self,nil];
    BarButtonItem的方法:设置返回按钮的颜色和标题位置,图片背景。

    29 请简述在iOS中如何实现和优化TableView?

    优化tableview:
    1.复用单元格;
    2.使用不透明的试图,单元格中尽量少使用动画;
    3.图片使用异步加载同时设置图片加载的并发数;
    4.滑动时不加载图片,滑动结束开始加载;
    5.文字图片可以直接drawInRect绘制;
    6.非必要条件下,减少刷新的cell;
    7.如果cell是动态行高,可直接计算高度后缓存

    30.请问你如何解决tableviewcell加载数据过多导致tableview卡顿的现象?比如一个cell里面有很多图片,还有很多文字,加载过多数据会怎么样,拖动tableview会卡顿,你怎么处理?

    1.提前计算并缓存好高度,因为heightForRow最频繁的调用。
    2.异步绘制,遇到复杂界面,性能瓶颈时,可能是突破口。
    3.滑动时按需加载,这个在大量图片展示,网络加载时,很管用。(SDWebImage已经实现异步加载)。
    4.重用cells。
    5.如果cell内显示得内容来自web,使用异步加载,缓存结果请求。
    6.少用或不用透明图层,使用不透明视图。
    7.尽量使所有的view opaque,包括cell本身。
    8.减少subViews
    9.少用addView给cell动态添加view,可以初始化的时候就添加,然后通过hide控制是否显示。

    1. 说说UISplitViewController的使用机制。
    2. iOS中手势是怎么实现的
      UIGestureRecognizer:定义了手势所需的一些基本的属性和方法。当然,也可以自定义自己的手势
      一些常用的方法:位置信息,两个手势之间关系,拍击 (任意次数的拍击)
      向里或向外捏 (用于缩放)
      摇动或者拖拽
      擦碰 (以任意方向)
      旋转 (手指朝相反方向移动)
      长按

    33.在UIView中支持多点触摸,需要打开什么属性:

            self.view.multipleTouchEnabled = TRUE;  
    


    1. What is responder chain?
      说说响应者链

    找到第一响应者First Responser – > The Window – >The Application – > App Delegate
    响应者链:
    监听,传给第一响应者,uiapplication->uiview->第二响应者->…….
    UIResponder有一个nextResponder属性,通过该属性可以组成一个响应者链,事件或消息在其路径上进行传递
    如果UIResponder没有处理传给它的事件,会将未处理的消息转发给自己的nextResponder
    动画
    1.view的哪些属性可以做动画?
    2.定义UIView动画开始函数是什么?结束函数是什么?
    4.如何实现连续的2个动画?如何让一个视图同时执行位移和翻转动画?
    5 . 以 UIView 类 animateWithDuration:animations:为例,简述UIView动画原理。
    6.做过哪些动画,举例说明?
    音频、视屏、照相机等
    播放音频:AV Foundation框架
    1 . iOS开发怎样实现录音
    2.如何将图片添加到照片库
    3.制作相册,写出思路。


    数据持久化
    1 . How can you store data in iPhone applications?

    • 属性列表
      Preference(NSUserDefaults)
    • 键值归档(NSKeyedArchiver、NSCoding)

    • SQLite数据库(存储量比较大,文件形式存储):以表的形式存储。可移植行好

    • Core Data:面向对象,可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。core data提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用core data的时候,你不用安装额外的数据库系统,因为core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当core data在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。

    2 .什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?

    3 . What is NSManagedObject model?

    NSManagedObject是Core Data中的实体对象

    4 . ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

    iOS中可以有四种持久化数据的方式:属性列表、对象归档、SQLite3和Core Data;core data
    mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与core data框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。
    Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型,但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对一、对多的关系。

    5 . What is predicate?

    谓词:可以以一定条件来过滤数组、字典等集合数据,也能用在Core Data的数据查询中

    6 . 谈谈你对Core Data的理解


    7 .会用哪些数据库


    8.程序挂死后,保存数据


    9.用来存放用户数据可以有哪几种形式?分别介绍机制?


    11 . iOS开发中数据库的实现和应用通常是如何进行的?


    12.应用程序的文件可以保持在哪三个目录下?


    13 . iOS的沙盒机制是什么?沙盒中一般有哪几种目录结构,请谈谈每个里边存储什么样的数据?如何避免你的应用数据存储违反iOS的数据存储指南


    14.有一个表中有很多条记录,包括有一个记录时间属性,编写一个SQL语句,来执行一个清理操作,保留最近的20条记录获取所有age为20的记录。


    15 . 用SQL写一个简单的语句,从friend表中


    16.简单描述下数据库中DML、DDL、DCL的区别


    17.你所知的与文件访问相关的类有哪些?

    NSFileManager
    Nsdictionary
    Plist
    Sql

    18 . 30天免登陆,开启程序进入上次页面,保存数据


    20 . 如何避免文件被iCould同步

    同步沙盒数据:
    不能存在docoment(通常存用户数据)下
    可以存在cache上


    进程、线程
    1.线程和进程的区别?

    (1)进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

    (2)进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
    进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
    共享变量可以实现线程调用另一个线程。

    2 . OC中创建线程的方法是什么?如何指定在主线程中执行代码?如何延时执行代码?
    - NSThread
    - NSOperationQueue和NSOperation
    GCD

                主线程中执行代码
                [self performSelectorOnMainThread: withObject: waitUntilDone:];
                [self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];
                dispatch_async(dispatch_get_main_queue(), ^{
                });
    

    延时执行

                    double delayInSeconds = 2.0;
                    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 
                    (int64_t)(delayInSeconds * NSEC_PER_SEC));
                    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){        
                    });
                    [self performSelector: withObject: afterDelay:];
                    [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];
    

    3. What is NSOperation queue?
    queue可以设置最大并发数;

    用来存放NSOperation对象的队列,可以用来异步执行一些操作。
    一般可以用在网络请求等耗时操作,存放NSOperation的集合类。
    操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。
    网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
    这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
    但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。
    但是转念一想其实可以参考银行的取票和叫号系统。
    因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。
    但是后来看到一票关于这操作队列话题的文章,其中有一句提到
    “因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”
    瞬间觉得这个queue名字有点忽悠人了,还不如pool综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。
    Invocation 和block。执行有直接start开始、队列。
    操作依赖、监听两种方法可以实现操作优先级。

    什么是GCD,举例说明在什么情况下使用。函数dispatch_sync,dispatch_async,dispatch_once,dispatch_apply,分别有什么功能。

    GCD是一套低层级的C API,通过 GCD,开发者只需要向队列中添加一段代码块(block或C函数指针),而不需要直接和线程打交道。GCD在后端管理着一个线程池,它不仅决定着你的代码块将在哪个线程被执行,还根据可用的系统资源对这些线程进行管理。这样通过GCD来管理线程,从而解决线程被创建的问题。
    利用dispatch_once创建单例。不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
    dispatch_apply,作用是把指定次数指定的block添加到queue中,第一个参数是迭代次数,第二个是所在的队列,第三个是当前索引,dispatch_apply可以利用多核的优势,所以输出的index顺序不是一定的。(同步函数)


    1. GCD深层的研究?都说GCD很简单指的是什么简单?

    延迟执行,dispatch_after
    重复执行次数:dispatch_apply
    GCD提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱,而且因为基于block,它能极为简单得在不同代码作用域之间传递上下文。
    *能自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率。


    在iOS如何实现多线程和异步任务管理?
    dispatch_async

    nsoperation:使用他的两个子类:NSInvocatonOPeraton和NABlockOperation。加入到队列中,会开辟一个新的线程。可设置:最大并发数maxConcurrentOperationCount、监听setCompletionBlock、操作依赖。
    //添加操作依赖 3完了执行2
    [operation2 addDependency:operation3];

    如何同步多个线程;线程组:阻塞线程直到一个或多个任务完成的一种方式。些任务可以是同步的,也可以是异步的,即便在不同的队列也行


    7 . tableView加载图片,线程锁


    8.如何实现图片的异步加载

            [cell.imageVIew  sd_setImageWithURL:]
    

    9.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?


    10 . runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样

    runloop是事件接收和分发机制的一个实现,是线程进入和被线程用来响应事件以及调用事件处理函数的地方。input sources和timer sources。前者传递异步事件,通常是来自其他线程和不同的程序中的消息;后者传递同步事件(重复执行或者在特定时间上触发)。所有这两种sources都有特定的代码来处理。

    11 . block当前线程,且还能响应当前线程的timer事件,touch事件等。
    12.timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

    NSTimer的可以精确到50-100毫秒,精准消耗更多的CPU循环和电量,可以使用mach_absolute_time()获取到CPU的tickcount的计数值,可以通过”mach_timebase_info”函数获取到纳秒级的精确度。然后使用mach_wait_until(uint64_t deadline)函数,直到指定的时间之后,就可以执行指定任务了。

    13.谈谈你在项目中怎么处理线程和进程的问题
    14 . unix上进程怎么通信

    UNIX主要支持三种通信方式:
    1.基本通信:主要用来协调进程间的同步和互斥
    (1)锁文件通信
    通信的双方通过查找特定目录下特定类型的文件(称锁文件)来完成进程间 对临界资源访问时的互斥。例如进程p1访问一个临界资源,首先查看是否有一个特定类型文件,若有,则等待一段时间再查找锁文件。
    (2)记录锁文件
    2.管道通信:适应大批量的数据传递
    3. IPC:适应大批量的数据传递

    15.列举几种进程的同步机制,并比较其优缺点

    原子操作、信号量机制、自旋锁、管程、会合、分布式系统

    16.进程之间通信的途径(一个程序调用另一个程序)
    共享存储系统消息传递系统管道:以文件系统为基础

            //调用另一个程序
            [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://www.baidu.com"]];
    

    共享存储区、信号量、信号、管道、

    17.进程死锁的原因

    资源竞争及进程推进顺序非法

    18.死锁的4个必要条件

    互斥、请求保持、不可剥夺、环路

    19.死锁的处理

    鸵鸟策略、预防策略、避免策略、检测与解除死锁

    网络开发

    网络请求的三方库:

    ASIHttpRequest,比较臃肿,ASI早就不维护了,是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。
    AFNektwork感觉比较轻量级,
    本人推荐MKNetWork,

    怎样发送同步请求:等待服务器返回才继续操作,阻塞主线程。
    怎样发送异步请求:程序可以继续运行。

    1.创建URL,进行网络请求。NSURLRequest,连接服务器NSURLConnection

    监听多个图片的完成:线程组。如果是AFNetwork:在线程中建立同步请求
    离线缓存具体实现?比如网易新闻,一个tableview里面有很多图片和文字,你具体怎么操作,用什么实现?

    两种缓存方法:1.自己写缓存:将服务器返回数据保存沙盒。2.使用ASIHTTPREquest和ASIDownloadCache本地缓存:初始化ASIDownloadCache对象,设置缓存路径,方式setDownloadCache:appDelegate.myCache,数据存储策略ASICachePermanentlyCacheStoragePolicy,最后清理缓存。

    iOS开发中通常如何实现网络连接和访问?试举一两个常用的iOS网络框架,并简要说出其使用方式?

    HTTP协议, NSURLConnection, JSON及其解析,

    3.网络连接(类似题:网络编程你熟悉吗?具体说一说)
    4 . HTTP协议的基本工作原理和过程如何?GET和POST的主要区别是什么?试举几个常用的HTTP通讯状态码?
    5.网络解析用到哪几种解析格式?分别介绍原理

    XML解析:
    sax:串流解析,苹果自己有类。
    代理NSXMLParserDelegate
    读xml文件:pathForResource-转成data
    解析:创建解析类NSXMLParser对象,开始解析parse

    pragma NSXMLParserDelegate:

    DidStartDocument(初始化数组)、DidEndDocument(输出数组数据)、didStartElement(取得其他类属性(初始化类))、didEndElement(和xml文件节点名一级一级对比,处理属性值)、foundCharacters(属性赋值)
    dom:要用三方库Gdata。
    Plist配置:Header Search Paths,Other Linker Flags,对不支持arc文件做配置:compile source->-fno-objc-arc
    同上读xml文件-》GDataXMLDocument类对象初始化-》读根节点、子节点、遍历获取属性

    pragma second method—XPath-直接得到某属性值

    读根结点、子节点.子节点调用Xpath:
    nodesForXPath:@”/student_list/student/name”
    遍历节点-》获得属性值
    for (GDataXMLNode *nodein nodes) {
    NSLog(@”nodes%@”,[nodestringValue]);//direct get value like name // nodes张三 nodes李四
    }

    6.解释XML和Json的含义(有什么区别)?
    XML全称eXtensible Markup Language,是通过自定义的扩展标签来保存数据,是曾经异构系统之间交换数据的事实标准,也被很多系统用于保存配置信息(如plist文件),但是目前这两项功能都几乎被JSON取代。
    IOS5自带解析类NSJSONSerialization方法解析:(无需导入包,IOS5支持,低版本IOS不支持)
    NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&e

    7.网络解析可以用到哪些第三方插件?
    网络通信
    1、ASIHTTPRequest
    下载地址:https://github.com/pokeb/asi-http-request
    2、AFNetworking
    下载地址:https://github.com/AFNetworking/AFNetworking
    3、MKNetworkKit
    最近做的不错的一个通讯类库,具有AFNetworking和ASIHTTPRequest双方的优点,甚至功能更丰富一些,
    下载地址:https://github.com/MugunthKumar/MKNetworkKit
    Socket
    1、CocoaAsyncSocket
    CocoaAsyncSocket是用的最广泛的socket开发库,省略了程序员与CFNetwork接触的时间,延长了程序员寿命。
    下载地址:https://github.com/robbiehanson/CocoaAsyncSocket

    2、SocketRocket
    SocketRocket是Square开发的一个实现webSocket的库,可以轻松的实现即时通信。
    下载地址:https://github.com/square/SocketRocket

    数据解析
    1、SBJSON
    SBJson的解析速度其实是比较慢的,但是不知道为什么它却是用的最广的。
    下载地址:

    2、JSONKit
    JSONKit解析速度上最接近iOS原生解析类,当然iOS5.0才开始支持原生解析,所以选择一个库还是很必要的。
    下载地址:https://github.com/johnezang/JSONKit

    3、TouchJSON
    TouchJSON用的也比较广泛.
    下载地址:https://github.com/TouchCode/TouchJSON

    4、json-framework
    没有用过。
    下载地址:https://github.com/stig/json-framework

    5、TBXML
    TBXML是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。
    下载地址:https://github.com/71squared/TBXML

    6、TouchXML
    TouchXML这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。
    下载地址:https://github.com/TouchCode/TouchXML

    7、KissXML
    KissXML这是一套基于TouchXML的XML解析类库,只不过实现了支持XML的修改。
    下载地址:https://github.com/robbiehanson/KissXML

    8、GDataXML
    GDataXML是Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。
    下载地址:

    第三方管理
    1、fmdb
    fmdb是一个数据库管理库,封装了sqlite相关的sql语句,简化数据库操作。
    下载地址:https://github.com/ccgus/fmdb

    2、ssziparchive
    ssziparchive与sstoolkit是同一个作者,这哥们儿简直是个天才。
    https://github.com/soffes/ssziparchive

    3、ZipArchive
    ZipArchive同样是minizip的封装。
    https://github.com/mattconnolly/ZipArchive

    4、Objective-Zip
    Objective-Zip将Zlib和MiniZip用Objective-C进行了封装,使用起来非常简单。
    https://github.com/flyingdolphinstudio/Objective-Zip

    5、zxing
    zxing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、DataMatrix、UPC的1D条形码进行解码。其提供了多种平台下的客户端。
    https://github.com/zxing/zxing

    6、ZBar
    ZBar是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图片扫描,支持多平台包括 iPhone手机。同时 ZBar提供了二维码扫描的 API开发包。
    https://github.com/ZBar/ZBar

    7、ObjQREncoder
    ObjQREncoder 是 Objective-C的二维码的编码器,用于生成二维码图像。
    https://github.com/jverkoey/ObjQREncoder

    8、OpenUDID
    OpenUDID是iOS禁止使用系统UDID之后的新解决方法。
    https://github.com/ylechelle/OpenUDID

    9、RegexKitLite
    RegexKitLite 是一个轻量级的 Objective-C的正则表达式库,支持 Mac OS X和 iOS,使用ICU库开发。
    https://github.com/wezm/RegexKitLite

    10、STUtils
    STUtils是一系列的工具集,包含了很多对于iOS原生类的扩展,当然也包含一个用于安全保存用户密码STKeyChain。
    https://github.com/ldandersen/STUtils

    11、scifihifi-iphone
    scifihifi-iphone用于安全保存用户密码到keychain中。
    https://github.com/ldandersen/scifihifi-iphone

    12、sskeychain
    sskeychain同scifihifi-iphone一样,不过属于轻量级。
    https://github.com/soffes/sskeychain

    13、SDWebImage
    SDWebImage调用网站上的图片,跟本地调用内置在应用包里的图片一样简单。操作也很简单。
    https://github.com/rs/SDWebImage

    14、umeng
    umeng既有统计分析,也有社会化组件。但是统计分析的用户数似乎明显多于其社会化组件的用户。
    http://dev.umeng.com/analytics/ios/sdk-download

    第三方UI
    1、appirater
    appirater是一个可以直接使用到任何iPhone应用中的开源类,用于提醒用户在打开App时,对应用进行评论或打分。
    下载地址:https://github.com/arashpayan/appirater

    2、FDStatusBarNotifierView
    FDStatusBarNotifierView 实现了在状态栏中显示自定义提醒信息的功能。
    下载地址:https://github.com/frankdilo/FDStatusBarNotifierView

    3、MTStatusBarOverlay
    MTStatusBarOverlay 是一个定制的 iOS状态栏,用于覆盖系统默认的状态栏。
    下载地址:https://github.com/myell0w/MTStatusBarOverlay

    4、iCarousel
    iCarousel是一个用来简化在 iOS上实现旋转木马时的视图切换效果,支持 iPad,提供多种切换效果。
    下载地址:https://github.com/nicklockwood/iCarousel

    5、MBProgressHUD
    MBProgressHUD就不多说了,伟大的菊花。
    下载地址:https://github.com/jdg/MBProgressHUD

    6、SVProgressHUD
    SVProgressHUD是一个轻量级的菊花。
    下载地址:https://github.com/samvermette/SVProgressHUD

    7、MWPhotoBrowser
    MWPhotoBrowser实现了一个照片浏览器类似 iOS自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存。可对图片进行缩放等操作。
    下载地址:https://github.com/mwaterfall/MWPhotoBrowser

    8、ShareSDK
    ShareSDK支持分享到新浪微博、微信好友、微信朋友圈、QQ好友、腾迅微博、QQ空间、人人网、开心网、豆瓣、搜狐微博、网易微博、短信、邮件、打印、拷贝等。但是由于这个SDK包很大,所以用的时候一定要精简一下。下载地址:http://sharesdk.cn/Download

    1. JSON的基本格式如何?iOS开发中通常如何处理JSON?
      9、数据格式错误,你怎么处理?比如JSON格式返回数据 “name”:@”“你怎么去处理或者说帧别?
    2. token机制
      11.写一个同步请求的方法,并返回结果(写一个发送同步http请求,并获得返回结果的方法)
      12.请尝试设计和说明在iOS应用开发中如何实现一个安全的网络登录过程?
      加密存储。。。。
      钥匙链
      13.在不使用第三方的情况下如何用系统的数据解析,异步加载图片?

    3. 断点续传ASIHttpRequest具体细节
      1.导入ASIHTTPRequest第三方类库
      ASIHTTPRequest.h、ASINetworkQueue.h
      代理ASIHTTPRequestDelegate
      下载地址:ASIHttpRequest类库 完整代码下载:下载

    2.在 .h文件中
    [cpp] view plaincopy

    import

    import “ASIHTTPRequest.h”

    import “ASINetworkQueue.h”

    @interface DownLoadViewController : UIViewController
    {
    UIProgressView *_progressView;
    }

    @property(nonatomic, retain) UIProgressView *progressView;
    @property(nonatomic, retain) ASINetworkQueue *asiQueue;
    @property(nonatomic, retain) ASIHTTPRequest *asiHttpRequest;
    @end

    3.在 .m文件中实现这一过程
    首先开启队列:
    [cpp] view plaincopy
    _asiQueue=[[ASINetworkQueue alloc]init];//开启队列
    [_asiQueue reset];//nil
    _asiQueue.showAccurateProgress=YES;//进度
    [_asiQueue go];

    实现下载:
    [cpp] view plaincopy
    NSURL *url = [NSURL URLWithString:@”请求地址”];

    _asiHttpRequest=[ASIHTTPRequest requestWithURL:url];
    _asiHttpRequest.delegate=self;
    _asiHttpRequest.downloadProgressDelegate=self;//下载进度的代理,用于断点续传

    path = NSHomeDirectory();//该方法得到的是应用程序目录的路径  
    

    //目的路径,设置一个目的路径用来存储下载下来的文件
    NSString *savePath = [path stringByAppendingPathComponent:@”qgw.mp3”];
    /*
    临时路径:
    1.设置一个临时路径用来存储下载过程中的文件
    2.当下载完后会把这个文件拷贝到目的路径中,并删除临时路径中的文件
    3.断点续传:当设置断点续传的属性为YES后,每次执行都会到临时路径中寻找要下载的文件是否存在,下载的进度等等。。。然后就会在此基础上继续下载,从而实现续传的效果
    设置临时路径在这个过程中是相当重要的。。。
    */
    NSString *temp = [path stringByAppendingPathComponent:@”temp”];

    /*
    又在临时路径中添加了一个mp3格式的文件,这就相当于设置了一个假的要下载的文件,其实是不存在的,可以这么理解:这里提供了一个容器,下载的内容填充到了这个容器中。
    这个容器是必须要设置的,要不然它会不知道要下载到什么里面。。。

       会有人说:问什么不和上面的临时路径拚在一起,不是一样么:NSString *temp = [path stringByAppendingPathComponent:@"temp/qgw.mp3"]; 
       这是不行的,因为你的临时路径必须要保证是正确的、是拥有的,所以在下面你要用NSFileManager来判断是否存在这么一个路径,如果不存在就去创建, 
       当你创建的时候会把qgw.mp3当作是一个文件夹来创建的,所以每次断点续传的时候都会进入到qgw.mp3这个文件夹中寻找,当然是找不到的(因为qwg.mp3就是) 
       so,要分开来写。。。 
    
    */  
    

    NSString *tempPath = [temp stringByAppendingPathComponent:@”qgw.mp3”];

    //创建文件管理器
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //判断temp文件夹是否存在
    BOOL fileExists = [fileManager fileExistsAtPath:temp];
    if (!fileExists)
    {//如果不存在则创建,因为下载时,不会自动创建文件夹

       [fileManager createDirectoryAtPath:temp  
              withIntermediateDirectories:YES  
                               attributes:nil  
                                    error:nil];  
    

    }

    [ _asiHttpRequest setDownloadDestinationPath:savePath ];//下载路径
    [ _asiHttpRequest setTemporaryFileDownloadPath:tempPath ];//临时路径,一定要设置临时路径。。

    _asiHttpRequest.allowResumeForFileDownloads = YES;//打开断点,是否要断点续传

    //进度条
    _progressView.alpha = 1.0f;
    _progressView.progress=0;//赋值为0

    [_asiQueue addOperation:_asiHttpRequest];//加入队列

    得到下载的进度:
    [cpp] view plaincopy
    //代理方法,得到下载进度
    - (void)setProgress:(float)newProgress{
    [_progressView setProgress:newProgress];//赋给进度条
    }

    停止下载:
    [cpp] view plaincopy
    [_asiHttpRequest clearDelegatesAndCancel];//停掉

    15.了解socket吗?简要说一下(利用socket建立网络连接的步骤)
    在头文件中声明输入流和输出流和一个消息数组
    二:实现输入输出流的监听stream: handleEvent。关闭I/O流。并从主运行移除
    三:链接服务器:c的I/O流->oc对象,加入主循环,打开I/O流
    四:登陆:要登录,发送的数据格式为 “iam:zhangsan”;聊天消息,数据格式为 “msg:did you have dinner”;
    五:读取服务器返回数据:
    //建立一个缓冲区可以放1024个字节
    uint8_t buf[1024];
    //返回实际装的字节数,转化成字符串。接收数据reloadDataWithText:。
    六:发送数据:拼接成所需格式。转成data数据输出流调用write:maxLength发送。
    // 发送完数据,清空textField
    textField.text = nil;
    七:实现数据的显示,并且每发送一次消息都会滚动到对应的位置
    接收数据,更新显示。
    // 发送完数据,清空textField
    textField.text = nil;
    //数据多,应该往上滚动
    NSIndexPath *lastPath = [NSIndexPath indexPathForRow:self.chatMsgs.count - 1 inSection:0];
    [self.tableView scrollToRowAtIndexPath:lastPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

    八:监听键盘的改变

    pragma – 代理

    1. http和scoket通信的区别。
      xmpp:底层是xml,xmppframework,需要对应的openfire服务器,然后在ios上用xmppframework可以直接发送消息

      socket处理即时通信,客户端,服务器端连续接收连接请求因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。。

      HTTP超文本传输协议,每次请求都需要服务器响应,短连接,一次连接。1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

      Socket连接与HTTP连接
      由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

      而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
      很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

    2. get是从服务器上获取数据,post是向服务器传送数据。Get请求参数大小有限制,post没有限制。
    3. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    4. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
    5. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
    6. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    17.了解哪些网络协议,简要说明一下?
    网络协议遍及OSI通信模型的各个层次,从我们非常熟悉的TCP/IP、HTTP、FTP协议,到OSPF、IGP
    常用的协议:TCP/IP FTP(远程文件传输协议) SMTP(邮政传输协议) NFS(网络文件服务器) HTTP:面向对象
    HTTP协议的主要特点可概括如下:
    1.支持客户/服务器模式。
    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
    由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    18.下面请求数据用了什么协议,请求的数据格式是什么?
    UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.frame];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@”http://pzpromop.s3.amazonaws.com/PromoNeutral.html“]]];
    [self.view addSubview:webView];
    19.想传输一张图片,可用什么协议传输?
    20.做过的项目是否涉及网络访问功能,使用什么对象完成网络功能?
    推送
    1. What is push notification?
    ?
    什么是推送消息?
    本地推送:程序内部弹出通知到用户设备
    远程推送:由推送服务器推送通知到用户设备
    2.实现消息推送的步骤?
    数据结构
    1.堆和栈的区别?
    (1)管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
    (2)申请大小:
    栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
    (3)碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出。
    (4)分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
    (5)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
    2.队列和栈有什么区别?
    3.基于线性表的查找法,了解哪些?
    4.请细说折半查找法的原理,最好能举出例子。
    5.说一下自己了解的排序方法,并举出实例。
    冒泡二分法堆排序直接插入快速排序 选择排序希尔排序归并

    综合
    1.试举几个常用的Cocoa Touch组件和框架,并说明它们的主要功能。
    cocoa touch框架
    Address Book UI 框架联系人
    Event Kit UI 框架事件
    Game Kit 框架
    点对点连接及游戏内语音
    iAd 框架
    Map Kit 框架
    Message UI 框架电子邮件
    UIKit 框架
    创建和管理应用程序的用户界面

    Core Animation基于组合独立图层模型
    Core Audio 是播放,处理和录制音频
    Core Data
    音频和视频
    Core Audio:
    OpenAL
    Media Library
    AV Foundation
    数据管理
    Core Data
    SQLite
    图形和动画
    Core Animation
    OpenGL ES
    Quartz 2D
    网络
    Bonjour
    WebKit
    BSD Sockets
    用户应用
    Address Book
    Core Location
    Map Kit
    Store Kit
    Cocoa中有虚基类的概念么?怎么简洁的实现?
    虚基类主要解决在多重继承时,基类可能被多次继承,虚基类主要提供一个基类给派生类

    4.类工厂方法是什么
    分配和初始化合在一个步骤中,返回被创建的对象,并
    进行自动释放处理。+ (type)className…(其中 className不包括任何前缀)。

    工厂方法则可以避免为可能没有用的对象盲目分配内存。
    5. Difference between method and selector?
    方法和选择器有何不同?
    通过一个selector可以找到方法地址,进而调用一个方法
    6. Objective C中的selector是什么?
    你可以理解 @selector()就是取类方法的地址,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Objective-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)。
    7. What is lazy loading?
    懒汉模式,只在用到的时候才去初始化。
    也可以理解成延时加载。tableView中图片的加载显示了。
    一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

    8.目标-动作机制
    目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见”插座变量”部分)
    的形式保有其动作消息的目标。
    动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
    程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
    9.动态绑定—在运行时确定要调用的方法
    动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,

    特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。
    10.请写出你对MVC模式的理解;MVC模型是如何构成?
    MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的协调者。
    11.何为MVC?它有什么好处?在iOS开发中是如何实现和体现MVC模式的?
    12.列举你所知道的设计模式,并简述。
    (一)代理模式
    实例:tableview的数据源delegate,通过和protocol的配合,完成委托诉求。
    列表row个数delegate、自定义的delegate
    (二)观察者模式
    应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。
    实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。

    KVO其实也是“观察者”设计模式的一种应用。
    (三)MVC模式
    应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
    实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。
    (四)单例模式
    应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
    实例:[UIApplication sharedApplication]。
    注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。
    object c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,
    返回的也只是此单例类的唯一静态变量。
    (五)策略模式
    应用场景:定义算法族,封装起来,使他们之间可以相互替换。
    实例:排序算法,NSArray的sortedArrayUsingSelector;经典的鸭子会叫,会飞案例。
    (六)工厂模式
    应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。
    优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。
    实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换
    增加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。

    */

    pragma mark- KVC简单介绍 KVC key valued coding键值编码 KVC通过键值间接编码

    pragma mark- KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

    注册观察者:addobserver;
    响应事件:observeValueForKeyPath
    移除观察者

    请描述iOS系统架构
    核心操作系统层(Core OS layer)、核心服务层(Core Services layer)、媒体层(Media layer)和可触摸层(Cocoa Touch layer)
    Core OS:内存管理、文件系统、电源管理以及一些其他的操作系统任务。它可以直接和硬件设备进行交互。
    Core Services是核心服务层,可以通过它来访问iOS的一些服务
    Media是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。
    4、Cocoa Touch是可触摸层,这一层为我们的应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。
    14.异常exception怎么捕获?不同的CPU结构上开销怎样?C中又什么类似的方法?
    15.如何对iOS设备进行性能测试?
    Timer Profile,Xcode自带的工具instrument,
    16. iOS能否嵌入其他语言?如何实现?
    c/c++/Objective-C /swift/
    17. C、C++和Obj -C如何混用?
    obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp
    2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
    3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。
    如果模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。
    如果模块以函数实现,那么头文件要按 c的格式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。

    总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是 obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp.
    18.如何获取用户当前语言
    NSArray *languages = [NSLocale preferredLanguages];
    NSString *currentLanguage = [languages objectAtIndex:0];
    19.如何实现App的多语言化
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@”” table:nil]
    20.何为Build Target?试举几个在实际工作中使用此功能的场景?
    21. App-Info plist文件中选取三项写出他们代表的意义
    Executaule file – CFBundleExecutable 程序安装包的名称
    Bundle identifier — CFBundleIdentifier 该束的唯一标识字符串
    InfoDictionary version — CFBundleInfoDictionaryVersion Info.plist格式的版本信息
    Icon file — CFBundleIconFile 应用程序图标名称,一般为icon.png
    plist文件由什么组成,本质是什么(类似题:plist文件是什么?结构是什么?)
    Info.plist本身是一种结构化的文本文件,它包含了一些重要的配置信息。Info.plist文件多数情况下是以UTF-8进行编码,并且其内部的配置内容其实是以XML格式进行组织。XML的根节点是一个词典(dictionary),包含描述bundle各个方面的keys和values。系统读取该文件,并获取app的配置信息。

    22.如何iOS在一个程序中启动另一个程序?
    使用OpenURL(即进程如何通讯、两个程序访问同一个存储空间(钥匙链))

    1. 如何判断用户设备是iPad还是iPhone
      if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)|| UIUserInterfaceIdiomPad
    2. 在iphone4上面做得东西如何兼容到ipone5
      iPhone4(s):分辨率960*640,高宽比1.5
      iPhone5(s):分辨率1136*640,高宽比1.775
      iPhone6:分辨率1334*750,高宽比1.779
      iPhone6+:分辨率1920*1080,高宽比1.778
      iPhone5(s)、6(+)的高宽比是一致的(16:9),即可以等比例缩放。因此可以按宽度适配:width(SCREEN_WIDTH/320)
      iPhone4(s)的屏高比iPhone5(s)低,若纵向排版紧张,可以iPhone5(s)为基准,按高度适配: fitScreenHeight= height(SCREEN_HEIGHT/568)
      **iPhone3/4、5、6、6+四组高度,在iPhone3/4下将按比例纵向缩小,在iPhone6、6+下将按比例纵向放大。
      25.请简述iOS应用开发如何支持多种屏幕和分辨率的?如iphone4/5和iPad
      1.放大 2.信箱(黑框)
      var isPad:Boolean =(screenWidth ==768|| screenWidth ==1536);
      starling.stage.stageWidth = isPad ?384 :320;
      starling.stage.stageHeight = isPad ?512 :480;
      26.如何实现横竖屏支持?
      shouldAutorotateToInterfaceOrientation :
      return (interfaceOrientation == UIInterfaceOrientationPortrait);
      27.请问如何让30*30的图片适配100*100的按钮,且不失真?
      IOS5.0以下:
      (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
      5.0以上要使用
      • (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets?
        28.谈谈你对iPhone专用程序和iPad专用程序的图标尺寸,命名规范以及设备尺寸的了解。
        iPhone4(s):分辨率960*640,高宽比1.5
        iPhone5(s):分辨率1136*640,高宽比1.775
        iPhone6:分辨率1334*750,高宽比1.779
        iPhone6+:分辨率1920*1080,高宽比1.778
        套适配规则总结起来就一句话:文字流式,控件弹性,图片等比缩放。
        29.用苹果设备一般情况下做几种界面

    30.为什么有些4.0独有的objective-c函数在3.1上运行时会报错.而4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?
    31. 现有一个程序A、需要兼容iOS4、iOS5两个版本,下面是程序A中的一段代码,有什么问题,如何修改?
    @implementation MyViewController
    - (IBAction)buttonAction:(id)sender
    {
    UIViewController *aController = [[UIViewController alloc] init];
    [self presentViewController:aController animated:YES];
    [aController release];
    }
    @end
    32. 什么是SDK
    它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。一般的工具包括用于调试和其他用途的实用工具。SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。
    33.移动开发最后生成什么文件,有什么组成
    最后打包完成是一个.ipa文件可以通过iTunes和其他工具对有测试资格的手机进行安装。

    ipa包解压后,是一个Payload文件夹,打开Payload文件夹,再右键显示包内容,包含2部分:_CodeSignature文件夹+程序的资源图片,再打开_CodeSignature文件夹,是一个CodeResources文件,打开观察发现只是一些属性值。
    34. ios中创建完工程后文件名是什么?结构是什么?
    35.在iOS应用开发中通常如何实现团队协作?请举出并简单解释SCM的几种重要操作?
    36.简要说明iOS IAP(应用内购买)的原理和实现方式,如何防范IAP破解?
    37.你在iOS开发中经常遇到哪些错误?
    38.请问你完成一个项目需要多少时间?从哪些方面去考虑和执行?
    39.请问你对别人的项目进行二次开发,读懂别人的代码需要多少时间?
    40.简要阐述如何在iOS程序中实现第三方验证和应用(如新浪微博和支付宝)
    使用支付宝进行一个完整的支付功能,大致有以下步骤:
    与支付宝签约,获得商户ID(partner)和账号ID(seller)
    下载相应的公钥私钥文件(加密签名用)
    下载支付宝SDK
    生成订单信息
    调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
    支付完毕后返回支付结果给商户客户端和服务器
    支付宝提供了Demo让开发人员快速了解支付的接入流程:http://club.alipay.com/thread.php?fid=703,遇到技术上的问题也以到论坛提问

    假设签约之类工作已经完成,我们开干

    要想集成支付功能,依赖以下文件夹的库文件(把这3个添加到你的客户端中)

    接口调用步骤
    1.封装订单模型
    AlixPayOrder *order = [[AlixPayOrder alloc] init];
    //生成订单描述
    NSString *orderSpec = [order description];

    2.签名
    id signer = CreateRSADataSigner(@“私钥key”);
    //传入订单描述进行签名
    NSString *signedString = [signer signString:orderSpec];

    3.生成订单字符串
    NSString *orderString = [NSString stringWithFormat:@”%@&sign=\”%@\”&sign_type=\”%@\”“,
    orderSpec, signedString, @”RSA”];

    4.调用支付接口
    AlixPay * alixpay = [AlixPay shared];
    // appScheme:商户自己的协议头
    int ret = [alixpay pay:orderString applicationScheme:appScheme];
    41.简要说明iOS应用开发的提交和审核流程?以及如何简化内部测试和发布的流程?
    app提交流程:
    1.在本地创建证书:
    打开钥匙串,创建本地证书
    2打开网页https://developer.apple.com开发者中心
    3.生成appid
    4.生成发布证书。
    5.把生成好的各种证书在本地安装或者,拷贝到钥匙串里面的我的证书中
    6.然后导出证书 ,后缀为.p12文件
    7.证书部分完成后,把证书导入,打包成正式版本的app。
    上传.ipa文件
    42.简述iOS应用开发环境的组成?iOS原生应用和web应用开发方面的主要区别在哪里?iOS模拟器和真机在开发上的主要区别在什么地方?
    43.你对你应聘的职业的认识或对团队开发的看法
    44.简要介绍下你熟悉的版本管理工具及使用方法
    45. APP如何上架
    46. 简单叙述下B/S,C/S的区别
    浏览器服务器模式 客户端服务器
    47.说说你了解的三方库,常用哪些Framework
    网络通信
    1、ASIHTTPRequest
    2、AFNetworking
    3、MKNetworkKit
    最近做的不错的一个通讯类库,具有AFNetworking和ASIHTTPRequest双方的优点,甚至功能更丰富一些,

    Socket
    1、CocoaAsyncSocket
    CocoaAsyncSocket是用的最广泛的socket开发库,省略了程序员与CFNetwork接触的时间,延长了程序员寿命。
    下载地址:https://github.com/robbiehanson/CocoaAsyncSocket

    2、SocketRocket
    SocketRocket是Square开发的一个实现webSocket的库,可以轻松的实现即时通信。
    下载地址:https://github.com/square/SocketRocket

    数据解析
    1、SBJSON
    SBJson的解析速度其实是比较慢的,但是不知道为什么它却是用的最广的。
    下载地址:

    2、JSONKit
    JSONKit解析速度上最接近iOS原生解析类,当然iOS5.0才开始支持原生解析,所以选择一个库还是很必要的。
    下载地址:https://github.com/johnezang/JSONKit

    3、TouchJSON
    TouchJSON用的也比较广泛.
    下载地址:https://github.com/TouchCode/TouchJSON

    4、json-framework
    没有用过。
    下载地址:https://github.com/stig/json-framework

    5、TBXML
    TBXML是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。
    下载地址:https://github.com/71squared/TBXML

    6、TouchXML
    TouchXML这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。
    下载地址:https://github.com/TouchCode/TouchXML

    7、KissXML
    KissXML这是一套基于TouchXML的XML解析类库,只不过实现了支持XML的修改。
    下载地址:https://github.com/robbiehanson/KissXML

    8、GDataXML
    GDataXML是Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。
    下载地址:

    第三方管理
    1、fmdb
    fmdb是一个数据库管理库,封装了sqlite相关的sql语句,简化数据库操作。
    下载地址:https://github.com/ccgus/fmdb

    2、ssziparchive
    ssziparchive与sstoolkit是同一个作者,这哥们儿简直是个天才。
    https://github.com/soffes/ssziparchive

    3、ZipArchive
    ZipArchive同样是minizip的封装。
    https://github.com/mattconnolly/ZipArchive

    4、Objective-Zip
    Objective-Zip将Zlib和MiniZip用Objective-C进行了封装,使用起来非常简单。
    https://github.com/flyingdolphinstudio/Objective-Zip

    5、zxing
    zxing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、DataMatrix、UPC的1D条形码进行解码。其提供了多种平台下的客户端。
    https://github.com/zxing/zxing

    6、ZBar
    ZBar是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图片扫描,支持多平台包括 iPhone手机。同时 ZBar提供了二维码扫描的 API开发包。
    https://github.com/ZBar/ZBar

    7、ObjQREncoder
    ObjQREncoder 是 Objective-C的二维码的编码器,用于生成二维码图像。
    https://github.com/jverkoey/ObjQREncoder

    8、OpenUDID
    OpenUDID是iOS禁止使用系统UDID之后的新解决方法。
    https://github.com/ylechelle/OpenUDID

    9、RegexKitLite
    RegexKitLite 是一个轻量级的 Objective-C的正则表达式库,支持 Mac OS X和 iOS,使用ICU库开发。
    https://github.com/wezm/RegexKitLite

    10、STUtils
    STUtils是一系列的工具集,包含了很多对于iOS原生类的扩展,当然也包含一个用于安全保存用户密码STKeyChain。
    https://github.com/ldandersen/STUtils

    11、scifihifi-iphone
    scifihifi-iphone用于安全保存用户密码到keychain中。
    https://github.com/ldandersen/scifihifi-iphone

    12、sskeychain
    sskeychain同scifihifi-iphone一样,不过属于轻量级。
    https://github.com/soffes/sskeychain

    13、SDWebImage
    SDWebImage调用网站上的图片,跟本地调用内置在应用包里的图片一样简单。操作也很简单。
    https://github.com/rs/SDWebImage

    14、umeng
    umeng既有统计分析,也有社会化组件。但是统计分析的用户数似乎明显多于其社会化组件的用户。
    http://dev.umeng.com/analytics/ios/sdk-download

    第三方UI
    1、appirater
    appirater是一个可以直接使用到任何iPhone应用中的开源类,用于提醒用户在打开App时,对应用进行评论或打分。
    下载地址:https://github.com/arashpayan/appirater

    2、FDStatusBarNotifierView
    FDStatusBarNotifierView 实现了在状态栏中显示自定义提醒信息的功能。
    下载地址:https://github.com/frankdilo/FDStatusBarNotifierView

    3、MTStatusBarOverlay
    MTStatusBarOverlay 是一个定制的 iOS状态栏,用于覆盖系统默认的状态栏。
    下载地址:https://github.com/myell0w/MTStatusBarOverlay

    4、iCarousel
    iCarousel是一个用来简化在 iOS上实现旋转木马时的视图切换效果,支持 iPad,提供多种切换效果。
    下载地址:https://github.com/nicklockwood/iCarousel

    5、MBProgressHUD
    MBProgressHUD就不多说了,伟大的菊花。
    下载地址:https://github.com/jdg/MBProgressHUD

    6、SVProgressHUD
    SVProgressHUD是一个轻量级的菊花。
    下载地址:https://github.com/samvermette/SVProgressHUD

    7、MWPhotoBrowser
    MWPhotoBrowser实现了一个照片浏览器类似 iOS自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存。可对图片进行缩放等操作。
    下载地址:https://github.com/mwaterfall/MWPhotoBrowser

    8、ShareSDK
    ShareSDK支持分享到新浪微博、微信好友、微信朋友圈、QQ好友、腾迅微博、QQ空间、人人网、开心网、豆瓣、搜狐微博、网易微博、短信、邮件、打印、拷贝等。但是由于这个SDK包很大,所以用的时候一定要精简一下。下载地址:http://sharesdk.cn/Download

    48.平时会注意代码复用,或经常重构自己的代码吗
    49.你做过最得意的项目是什么?
    50.怎样说明自己是一个学习能力强的人?
    51. iOS中使用GPS需要引入哪个头文件
    52.如何添加苹果地图,如何获取用户的位置信息?
    通过Core Location框架进行定位

    1. iOS9的新特新有哪些?
      55.如果要开发一个类似ecliplse的软件,支持插件结构,且开放给第三方开发,你会怎样设计它?(大概思路)
      选择题
    2. Objective-C中属性访问方法声明为@dynamic的时候()
      A.该属性不能够被访问;
      B.该属性访问方法由编译器自动生成;
      C.该属性访问方法在运行过程中由代码动态绑定;
      D.该属性访问方法不能够被改变;
    3. Objective-C中,关于异常处理机制的说法正确的是()
      A. 应当尽量多的使用@try…@catch…捕捉异常;
      B. 使用@try…@catch…处理异常不会影响性能;
      C. 使用@try…@catch…处理异常不会导致内存泄露问题;
      D. Cocoa框架内部通常不是异常安全的;
    4. Objective-C关于NSArray与NSMutableArray的说法错误的是()
      A. NSArray对象中的元素是不可被替换的;
      B. NSMutableArray类继承自NSArray;
      C. NSMutableArray对象的容量可以在初始化的时候指定;
      D. NSMutableArray对象容量固定的不可改变;
      4.下列程序设计语言中,哪种完全属于编译型语言()
      A、Ada B、Basic C、C#
      5.下列选项中,哪个不是C语言中的构造类型
      A、数组类型 B、结构体类型 C、联合体类型
      6、下列数据结构的实现中,一定属于线性结构的是()
      A、数组 B、图 C、Hash表
      7、一位法官在审理一起盗窃案中,对涉及到的四名嫌疑犯甲、乙、丙、丁进行审问,私人分别供述如下:
      甲说:“罪犯在乙、丙、丁三人之中”
      乙说:“我没有作案,是丙偷的”
      丙说:“在甲和丁中间有一人是罪犯”
      丁说:“乙说的是事实”
      经过充分的调查,证实这四人中有两人说了真话,另外两人说的是假话;
      那么,请你对此案进行裁决,确认谁是罪犯?
      A、乙是盗窃犯 B、乙和丙是盗窃犯 C、乙和丁是盗窃犯 D、甲和丁是盗窃犯
      8.请从逻辑或则理论的角度在以下项目的横线中填入后继字母或则数字:
      1)A、D、G、J、()
      2)1、3、6、10、()
      3)1、1、2、3、5、()
      4)21、20、18、15、11、()
      5)8、6、7、5、6、4、()
      6)256、16、4、()
      编程
    5. a = 1,b = 2,在不增加任何变量情况下交换a,b的值。
      (1)a = a + b;
      b = a - b;
      a = a - b;
      (2)a = a^b;//只能对int,char..
      b = a^b;
      a = a^b;
      (3)a = a * b;
      b = a / b;
      a = a / b;
    6. 请写出memset函数的声明。
      3.编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序。相同的字符在新字符串中只出现一次。

    4.编写一个标准的strcpy函数。
    5.编写一个函数实现对任意的人民币金额按最大面值进行拆分,例如1999元可以拆分成19张面值100元,1张面值50元,1张面值20元,1张面值10元,1张面值5元,2张面值2元的人民币。
    6.编写函数,把100-200之间的所有素数求出。
    7.设计一个算法,要求在20个数字中(0-19)随机选取10个数字,但这10个数字不能重复(用C语言或者OC实现)。
    8.一副牌有54张,请实现一个模拟洗牌的算法。
    9.有两个图形(Shape),圆(Circle)和矩形(Rectangle)还有两个打印机(Printer):OldPrinter、NewPrinter。用户的需求是想分别使用两个打印机打印圆和矩形。设计和组织这些类,实现用户所需要的功能。打印函数只需用printf打印出日志即可;
    10. 用objective-C编写冒泡排序
    11.输入一个n,求n的逆时针反向旋转矩阵
    (编程)定义2个新类,分别命名为Song/Playlist。Song对象包含歌曲的信息,歌名、艺术家、专辑、歌曲长度Playlist对象表示一个播放列表,包含播放列表名称和一个歌曲的集合,还应该提供添加和删除歌曲的方法。
    12.写一个tableview,然后格子的颜色按红、黄、蓝排列。
    13.上级操作题:(如果您愿意参加此项考核,请在下方空白位置标注“接受”或“放弃”)
    A.请用OC制作一个有10行的列表,列表中包含3种类型自定义Cell,并将这些Cell现实在列表中;
    B.点击其中的任何一个Cell,用push的方式跳转到另外一个界面DetailViewController
    C.根据点击的Cell不同,在DetailViewController中分别显示百度、腾讯或新浪微博

    没有更多推荐了,返回首页