iOS面试题

论坛 期权论坛     
选择匿名的用户   2021-5-30 11:25   67   0
<p></p>
<p><strong>1.#import和#include的区别 &#64;class?</strong></p>
<p>&#64;class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import</p>
<p>而#import比起#include的好处就是不会引起交叉编译</p>
<p> </p>
<p><strong>2. readwrite,readonly,assign,retain,copy,nonatomic 属性的作用</strong></p>
<p>&#64;property是 一个属性访问声明,扩号内支持以下几个属性:<br> 1,getter&#61;getName,setter&#61;setName,设置setter与 getter的方法名<br> 2,readwrite,readonly,设置可供访问级别<br> 2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题<br> 3,retain,setter方法对参数进行release旧值再retain新值,所有 实现都是这个顺序(CC上有相关资料)<br> 4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。<br> 5,nonatomic,非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。</p>
<p><strong>3.在一个对象的方法里面:self.name&#61; “object”;和name &#61;”object”有什么不同吗?</strong></p>
<p>答:</p>
<p>self.name &#61;&#34;object&#34;:会调用对象的setName()方法;</p>
<p>name &#61; &#34;object&#34;:会直接把object赋值给当前对象的name属性。</p>
<p> </p>
<p><strong>4.请简述self.name&#61; nil的机制,以及与[namerelease]的区别?</strong></p>
<p>self.name &#61;nil;   //使用nil参数调用setName:方法</p>
<p>[name release]生成的访问器将自动释放以前的name对象<strong></strong></p>
<p> </p>
<p><strong>5.请简要说明viewDidLoad和viewDidUnload何时调用</strong></p>
<p>答:</p>
<p>viewDidLoad在view从nib文件初始化时调用,</p>
<p>loadView在controller的view为nil时调用。</p>
<p>此方法在编程实现view时调用,view控制器默认会注册memory warning notification,</p>
<p>当view controller的任何view没有用的时候,</p>
<p>viewDidUnload会被调用,在这里实现将retain的view release,如果是retain的IBOutlet view 属性则不要在这里release,IBOutlet会负责release 。</p>
<p> </p>
<p><strong>6.实例化一个UITableView对象,要求写出关键语句?</strong></p>
<p>答:UITableView *my &#61; [[UITableView alloc]initWithFrame:&lt;(CGRect)frame&gt; style:&lt;(UITableViewStyle)style&gt;];</p>
<p>my.delegate &#61; self;</p>
<p>my.dataSource &#61; self;</p>
<p>首先需要分配空间设置表格类型</p>
<p>然后需要设置两个必须的委托对象。</p>
<p> </p>
<p><strong>7.使用sql语句查询出省名以湖开头,邮编为436001所在的市区?(5分)(表名及字段名自定义)</strong></p>
<p>select*fromcitys where postcode=436001 and province=’湖%’;</p>
<p><strong>8.打印结果</strong></p>
<p><strong>main()</strong></p>
<p><strong> { </strong></p>
<p><strong>   int a[5]&#61;{1,2,3,4,5}; </strong></p>
<p><strong>   int *ptr&#61;(int *)(&amp;a&#43;1);  </strong></p>
<p><strong>   printf(&#34;%d,%d&#34;,*(a&#43;1),*(ptr-1)); </strong></p>
<p><strong>}</strong></p>
<p>答:2,5</p>
<p>     *(a&#43;1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5<br>   &amp;a&#43;1不是首地址&#43;1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int)<br>   int *ptr&#61;(int *)(&amp;a&#43;1);<br>   则ptr实际 是&amp;(a[5]),也就是a&#43;5<br> 原因如下:</p>
<p>  &amp;a是数组指针,其类型为 int (*)[5];<br>   而 指针加1要根据指针类型加上一定的值,不同类型的指针&#43;1之后增加的大小不同。<br>   a是长度为5的int数组指针,所以要加 5*sizeof(int)<br>   所以ptr实际是a[5]<br>   但是prt与(&amp;a&#43;1)类型是不一样的(这点很重要)<br>    所以prt-1只会减去sizeof(int*)</p>
<p>  a,&amp;a的地址是一样的,但意思不一样<br>     a是数组首地址,也就是a[0]的地址,&amp;a是对象(数组)首地址,<br>     a&#43;1是数组下一元素的地址,即a[1],&amp;a&#43;1是下一个对象的地址,即a[5].</p>
<p><strong> </strong></p>
<p><strong>void Func ( char str[100] )  </strong></p>
<p><strong>{   </strong></p>
<p><strong>sizeof(str ) &#61; ?  </strong></p>
<p><strong>} </strong></p>
<p><strong>void*p &#61; malloc( 100 ); sizeof( p ) &#61; ?</strong></p>
<p>这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时&#
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP