self.name ="object":会调用对象的setName()方法;
4.请简述self.name= nil的机制,以及与[namerelease]的区别?
self.name =nil; //使用nil参数调用setName:方法
[name release]生成的访问器将自动释放以前的name对象
5.请简要说明viewDidLoad和viewDidUnload何时调用
viewDidLoad在view从nib文件初始化时调用,
loadView在controller的view为nil时调用。
此方法在编程实现view时调用,view控制器默认会注册memory warning notification,
当view controller的任何view没有用的时候,
select*fromcitys where postcode=436001 and province=’湖%’;
8.打印结果
*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int)
int *ptr=(int *)(&a+1);
则ptr实际 是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5];
而 指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)
a,&a的地址是一样的,但意思不一样
a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
void Func ( char str[100] ) \u2028
{ \u2028
sizeof(str ) = ? \u2028
} \u2028
void*p = malloc( 100 ); \u2028sizeof( p ) = ?
这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等 操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof( p ) 都为4。
9.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
答:#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
答:#define MIN(A,B) ((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方
法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的。 懂得在宏中小心地把参数用括号括起来 我也用这个问题开始讨论宏的副作用,例如: 当你写下面的代码时会发生什么事? least = MIN(*p++, b);
结果是:
((*p++) <= (b) ? (*p++) :(*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
11.数组和指针的区别
(1)数组可以申请在栈区和数据区;指针可以指向任意类型的内存块
(2)sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小
(3)数组名表示数组首地址,值不可以改变,如不可以将 ++ 作用于数组名上;普通指针的值可以改变,如可将++作用于指针上
13.简述内存分区情况
(1)代码区:存放函数二进制代码
(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量
(3)堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
(4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数
14.#include<filename>和#include”filename”有什么区别
答:#include<filename>直接在库文件目录中搜索所包含的文件;#include”filename”在当前目录下搜索所包含的文件,如果没有的话再到库文件目录搜索。
15.(1)const char *p;(2)charconst*p;(3)char*const p;(4)const char* const p;四个修饰指针有什么区别
答:(1)定义了一个指向不可变的字符串的字符指针
(2)和(1)一样
(3)定义了一个指向字符串的指针,该指针值不可改变,即不可改变指向
(4)定义了一个指向不可变的字符串的字符指针,且该指针也不可改变指向
free()是C标准库里面的,是一个函数。它调用malloc(),可以立即释放内存。因此它必须有malloc()传递一个指针,不然会引起异常。
-release是NSobject类的一个方法。它不会立即释放内存,它只是减少对象的一个引用计数。一直到它检测到0,然后调用-dealloc()。
看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了
代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性
一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关
24. 浅复制和深复制的区别?//浅拷贝和深拷贝\u2028
\u2028浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象\u2028
\u2028答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)//frame:框架、结构\u2028
bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)//bounds:界限
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
b)一个指向整型数的指针( A pointer to aninteger)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( Apointer to a pointer to an intege)r
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointer to a function that takes an integer as an argument
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions t
hat takean integer argument and return an integer )
b) int *a; // A pointer to aninteger
c) int **a; // A pointer to apointer to an integer
d) int a[10]; // An array of10 integers
e) int *a[10]; // An array of10 pointers to integers
f) int (*a)[10]; // A pointerto an array of 10 integers
g) int (*a)(int); // A pointerto a function a that takes an integer argument and returns aninteger
答:队列和栈是两种不同的数据容器。从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。
队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操作,一端进行出列队操作。
GET 方法提交数据不安全,数据置于请求行,客户端地址栏可见;
POST 方法提交数据安全,数据置于消息主体内,客户端不可见
32. 控件主要响应3种事件:(基于触摸的事件)、(基于值的事件)和(基于编辑的事件)。
33. xib文件的构成分为哪3个图标?都具有什么功能。(10分)
答:File’s Owner 是所有nib文件中的每个图标,它表示从磁盘加载nib文件的对象;
First Responder就是用户当前正在与之交互的对象;
View显示用户界面;完成用户交互;是UIView类或其子类。
答:loadView尽管不直接调用该方法,如多手动创建自己的视图,那么应该覆盖这个方法并将它们赋值给试图控制器的view属性。
viewDidLoad只有在视图控制器将其视图载入到内存之后才调用该方法,这是执行任何其他初始化操作的入口。
viewDidUnload当试图控制器从内存释放自己的方法的时候调用,用于清楚那些可能已经在试图控制器中创建的对象。
viewDidAppear当视图添加到窗口中以后或者上层视图移出图层后本视图变成顶级视图时调用,用于放置那些需要在视图显示后执行的代码。确保调用[super viewDidAppear:]。
35. 动画有基本类型有哪几种;表视图有哪几种基本样式(10分)?
36. 实现简单的表格显示需要设置UITableView的什么属性、实现什么协议(10分)?
答:实现简单的表格显示需要设置UITableView的dataSource和delegate属性,实现UITableViewDataSource和UITableViewDelegate协议。
37. Cocoa Touch提供了哪几种Core Animation过渡类型(10分)?
答:Cocoa Touch提供了4种Core Animation过渡类型,分别为:交叉淡化、推挤、显示和覆盖。
2. UIView有个重要属性layer,可以返回它的主CALayer实例。
3. UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。
5. 动画的运作:对UIView的subLayer(非主Layer)属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。
7.渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay方法来重绘显示。
8.变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性。
链表逆序就是把一个链表按照原来的链接顺序逆序实现(也就是将头变成尾,尾变成头)。
编程思路:其实最关键的是先通过原来的链接顺序找到下个节点,然后再把前个节点反序。
41. Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用(10分)。
42. iPhone OS主要提供了几种播放音频的方法(10分)?
43. 使用AVAudioPlayer类调用哪个框架、使用步骤(10分)?
-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;
-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;
45. 实例化一个UITableView对象,要求写出关键语句(10分)。
答:创建Socket的上下文;创建Socket;配置要访问的服务器信息;封装服务器信息;连接服务器;
47. Core Foundation中提供了哪几种操作Socket的方法(10分)?
答:CFNetwork、CFSocket和BSD Socket。
答:以DOM方式解析XML文件;以SAX方式解析XML文件;
-(void)doSomething:(NSString*)str;
@interfaceSimpleClass:NSObject< SimpleProtocol >{
-(void)doSomething:(NSString *)str
答案:多态,子类指针可以赋值给父类。这个题目其实可以出到一切面向对象语言中,因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。最重要的是转化成自我理解。
答案:基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。进一步点,考虑下如何在多线程访问单例时的安全性。
54. 是否在一个视图控制器中嵌入两个tableview控制器?\u2028
55.\u2028一个tableView是否可以关联两个不同的数据源?你会怎么处理?
答案:id是个很重要的类型,是个可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。
58.自动释放池跟GC(垃圾回收)有什么区别?iPhone上有GC么?[poolrelease] 和[pooldrain]有什么区别?
60. ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?
63.假定输入的字符串中只包含字母和*号。编写函数fun,功能是,除了中间和尾部的*号外,
例:*****A*BC*DEF*G**** 结果为:A*BC*DEF*G****
64.截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们(10分)。
NSString *str = "20|http://www.621life.com";
NSRange range = [strrangeOfString:@"|"];
int location = range.location;
NSString *str1 = [strsubstringToIndex:location];
NSString *str2 = [str substringFromIndex:location+1];
65.获取项目根路径,并在其下创建一个名称为userData的目录。(10分)。
// 获取根路径
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:];
// 创建文件系统管理器
NSFileManager *fileManager = [[NSFileManageralloc] init];
// 判断userData目录是否存在
if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {
// 不存在,创建一个userData目录
[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];
}
66.tableView的重用机制(10分)?
UITableView通过重用单元格来达到节省内存的目的:通过为每个单元格指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便重用.对于不同种类的单元格使用不同的ID,对于简单的表格,一个标识符就够了.
67.这段代码有什么问题吗
@implementation Person
i. (void)setAge:(int)newAge
{ self.age = newAge; }
死循环
68.用变量a给出下面的定义
a) 一个整型
b) 一个指向整型数的指针
c) 一个指向指针的的指针,它指向的指针是指向一个整型数
d) 一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
a) int a;
b) int *a;
c) int **a;
d) int a[10]
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int);
i) int (*a[10])(int);
69.给定一个字符串,输出本字符串中只出现一次并且最靠前的那个字符的位置?
比如"abaccddeeef" 则是b,输出2
int find(char *_str)
{
char *p = _str;
inti = 1;
while (*p)
{
char *temp = _str;
while (*temp)
{
if ((*p ==*temp)&&(p != temp))
{
break;
}
temp++;
if (*temp == 0) {
returni;
}
}
i++;
p++;
}
return-1;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intfind_char(constchar* str)
{
staticintpos[256];
const unsigned char* p =(const unsigned char*)str;
inti = 0;
if( (!str) || (!(*str)) )return -1;
memset(pos,-1,sizeof(pos));
while(*p){
if(pos[*p] == -1){
pos[*p] = p-(const unsigned char*)str;
}else{
pos[*p] = -2;
}
p++;
}
for(i=0;i<sizeof(pos)/sizeof(pos[0]);i++){
if(pos[i]>=0)returnpos[i];
}
return -1;
}
int main()
{
constchar* p ="abaccddeeef";
intpos = find_char(p);
printf("%d, it is'%c'\n",pos,pos!=-1?p[pos]:' ');
p ="abcdefghijklmnopqrstuvwxyz "
"abcdefghijklmnopqrstuwxyz";
pos = find_char(p);
printf("%d, it is'%c'\n",pos,pos!=-1?p[pos]:' ');
return0;
}
70.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么?
在OC中NSNumber是数字对象,可以进行拆装箱操作!
//将int转为NSNumber
NSNumber *num = [NSNumber numberWithInt:123];
//得到一个int
inttestNum = [numintValue];
71.用NSLog函数输出一个浮点类型,结果四舍五入,并保留一位小数
NSLog(@”%0.1f”,4.4324);
72.objective-c中的词典对象、可变词典对象是哪个,初始化一个含有两个键值对的可变词典对象,并动态的添加和删除一条记录,输出第一条记录.
词典NSDictionary,可变词典NSMutableDictionary,
//初始化一个可变词典,带有2个键值对
NSMutableDictionary *dic =[NSMutableDictionarydictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];
//添加
[dicsetObject:@"value3"forKey:@"key3"];
//删除
[dicremoveObjectForKey:@"key3"];
//获取(按key获取)
[dicobjectForKey:@"key1"];
73.获取项目根路径,并在其下创建一个名称为userData的目录。
// 获取根路径
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory = [paths objectAtIndex:];
// 创建文件系统管理器
NSFileManager *fileManager= [[NSFileManageralloc] init];
// 判断userData目录是否存在
if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {
// 不存在,创建一个userData目录
[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];
}
74.do-while与 while-do的区别?
do-while 先执行循环体,然后判断条件,如果条件判断为ture,则继续执行循环体,如果判断为false,则不执行循环体
while-do 是先判断条件是否正确,若正确则执行循环体,若不正确则不执行循环体。
所以do-while至少循环一次,而while-do有可能一次也不循环。
75.用C语言,求2到100内的所有素数和。
#include<stdio.h>
intisPrime(int n) //求素数,这是最经典的算法代码。建议记住
{
inti;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
inti,sum=0;
for(i=2;i<100;i++)
if( isPrime(i))
sum+=i;
printf("%5d",sum);
return 0 ;
}
intisPrime(int n)
{
inti;
for(i=2;i<=n/2;i++)
{
if(n%i==0)
break;
}
if(i>n/2)
return1;
else
return0;
}
76.单件实例是什么(10分)。
Foundation 和 Application Kit框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配 和初始化。 单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如
NSWorkspace),就应该产生 一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。
77.自动释放池是什么,如何工作。
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放