<p></p>
<p><strong>1.#import和#include的区别 @class?</strong></p>
<p>@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import</p>
<p>而#import比起#include的好处就是不会引起交叉编译</p>
<p> </p>
<p><strong>2. readwrite,readonly,assign,retain,copy,nonatomic 属性的作用</strong></p>
<p>@property是 一个属性访问声明,扩号内支持以下几个属性:<br> 1,getter=getName,setter=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= “object”;和name =”object”有什么不同吗?</strong></p>
<p>答:</p>
<p>self.name ="object":会调用对象的setName()方法;</p>
<p>name = "object":会直接把object赋值给当前对象的name属性。</p>
<p> </p>
<p><strong>4.请简述self.name= nil的机制,以及与[namerelease]的区别?</strong></p>
<p>self.name =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 = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];</p>
<p>my.delegate = self;</p>
<p>my.dataSource = 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]={1,2,3,4,5}; </strong></p>
<p><strong> int *ptr=(int *)(&a+1); </strong></p>
<p><strong> printf("%d,%d",*(a+1),*(ptr-1)); </strong></p>
<p><strong>}</strong></p>
<p>答:2,5</p>
<p> *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5<br> &a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int)<br> int *ptr=(int *)(&a+1);<br> 则ptr实际 是&(a[5]),也就是a+5<br> 原因如下:</p>
<p> &a是数组指针,其类型为 int (*)[5];<br> 而 指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。<br> a是长度为5的int数组指针,所以要加 5*sizeof(int)<br> 所以ptr实际是a[5]<br> 但是prt与(&a+1)类型是不一样的(这点很重要)<br> 所以prt-1只会减去sizeof(int*)</p>
<p> a,&a的地址是一样的,但意思不一样<br> a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,<br> a+1是数组下一元素的地址,即a[1],&a+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 ) = ? </strong></p>
<p><strong>} </strong></p>
<p><strong>void*p = malloc( 100 ); sizeof( p ) = ?</strong></p>
<p>这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时&# |
|