什么是KVC和KVO?
答:KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,
(1)首先根据方法名找到运行方法的时候所需要的环境参数。
(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。
(3)再直接查找得来的具体的方法实现。
KVO(Key-Value-Observing):当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名
Iphone基础面试题
1,用objective-c写一个插入法排序。
2.写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWIthCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
3.写一个委托Delegate的interface
答:
@protocol MyDelegate;
@class MyClass;
@interface MyClass: NSObject
{
id
}
// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
4.obj-c有私有方法么?私有变量呢
答:在Objective-C中没有私有方法,只有静态方法和实例方法。但是可以用@private修饰私有变量。
用 .m文件中使用catogory来实现私有方法。
5.#import跟#include的区别?
答:前者不会引起交叉编译的问题。因为在Objective-C中会存在C/C++和Object-C混编的问题,如果用include引入头文件,会导致交叉编译。
6.请写出你对MVC模式的理解
答:MVC模式考虑三种对象:模型对象、视图对象和控制器对象。模型对象负责应用程序的数据和定义操作数据的逻辑;视图对象知道如何显示应用程序的模型数据;控制器对象是M与V之间的协调者。
7.什么是键-值,键路径是什么 KVC KVO
答:模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。
8.c和obj-c如何混用,C++和obj-c呢
.mm .h
9.什么是目标-动作机制
10.请列举你熟悉cocoa touch框架(至少三个)
答:
Core Animation
通过 Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
11.请写出obj-c的内存管理代码
12.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease 消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当 程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1. ojc-c 是 通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
13.obj-c的优缺点
objc优点:
1) Cateogies
2) Posing
3) 动态识别
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空间
2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
OC没有多重继承,Java也没有 C++才有
OC使用协议来实现多重继承
14.readwrite,readonly,assign,retain,copy,nonatomic属性的作用
@property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。
15.在一个对象的方法里面:
self.name = “object”;
和
name =”object”;
有什么不同吗?
16.ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
内存警告会调用viewDidUnload
18.ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?
内存警告会调用didReceiveMemoryWarning
相机会出现内存不足的情况 去掉调用
[super didReceiveMemoryWarning];
Iphone工程师笔试试题
1.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不是首地址+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].
2. 以下为Windows NT下的32位C++程序,请计算sizeof的值
void Func ( char str[100] )
{
sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
这题很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。
3.还是考指针,不过我对cocoa的代码还是不太熟悉
大概是这样的
- (void)*getNSString(const NSString * inputString)
{
HYPERLINK "mailto:*output=@%22This%20" inputString = @"This is a main test\n";
return ;
}
-main(void)
{
NSString HYPERLINK "mailto:*a=@%22Main%20" *a=@"Main";
NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n", aString);
}
最后问输出的字符串:NULL,output在函数返回后,内存已经被释放。
4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
•; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
•; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
•; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
•; 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
写一个"标准"宏MIN
,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B)
((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
•;
标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方
法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
•; 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else
更优化的代码,了解这个用法是很重要的。
•; 懂得在宏中小心地把参数用括号括起来
•;
我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
结果是:
((*p++) <= (b) ? (*p++) : (*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
5.写一个委托的interface
@protocol MyDelegate;
@interface MyClass: NSObject
{
id
}
// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
6.写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
+ (id) stringWithCString: (const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
7.obj-c有多重继承么?不是的话有什么替代方法?
cocoa 中所有的类都是NSObject 的子类
多继承在这里是用protocol 委托代理 来实现的
你不用去考虑繁琐的多继承 ,虚基类的概念.
ood的多态特性 在 obj-c 中通过委托来实现.
8.obj-c有私有方法么?私有变量呢
objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) //category
- (void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的
9.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用
const意味着"只读",下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:
•; 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果
你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清
理的。)
•; 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
•; 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
(1)欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
(3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到
这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
•; 并行设备的硬件寄存器(如:状态寄存器)
•; 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
•; 多线程应用中被几个任务共享的变量
•; 一个参数既可以是const还可以是volatile吗?解释为什么。
•; 一个指针可以是volatile 吗?解释为什么。
下面是答案:
•; 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
•; 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
static 关键字的作用:
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
extern "C" 的作用
(1)被 extern "C"限定的函数或变量是 extern 类型的;
extern 是 C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,
其声明的函数和变量可以在本模块或其它模块中使用。
(2)被 extern "C"修饰的变量和函数是按照 C 语言方式编译和连接的;
extern "C"的惯用法
(1)在 C++中引用 C 语言中的函数和变量,在包含 C 语言头文件(假设为 cExample.h)时,需进
行下列处理:
extern "C"
{
#include "cExample.h"
}
而在 C 语言的头文件中,对其外部函数只能指定为 extern 类型,C 语言中不支持 extern "C"声明,
在.c 文件中包含了 extern "C"时会出现编译语法错误。
(2)在 C 中引用 C++语言中的函数和变量时,C++的头文件需添加 extern "C",但是在 C 语言中不
能直接引用声明了 extern "C"的该头文件,应该仅将 C 文件中将 C++中定义的 extern "C"函数声明为
extern 类型。
10.为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止该头文件被重复引用。
12.MVC模式的理解
MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的协调者。
14.列举几种进程的同步机制,并比较其优缺点。
答案: 原子操作 信号量机制 自旋锁 管程,会合,分布式系统
进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
进a程死锁的原因
答案:资源竞争及进程推进顺序非法
死锁的4个必要条件
答案:互斥、请求保持、不可剥夺、环路
死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
15.堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
16.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的
性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型
实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相
关对象的特定属性。
For example, the key path address.streetwould get the value of the address property from the receiving
object, and then determine the street property relative to the address object.
17.c和obj-c如何混用
1)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.目标-动作机制
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)
的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
19.cocoa touch框架
iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知当前位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:
Core Animation
通过 Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是 Cocoa Touch 中一小部分可用的框架:
音频和视频
Core Audio
OpenAL
Media Library
AV Foundation
数据管理
Core Data
SQLite
图形和动画
Core Animation
OpenGL ES
Quartz 2D
网络/li>
Bonjour
WebKit
BSD Sockets
用户应用
Address Book
Core Location
Map Kit
Store Kit
20.objc的内存管理
如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥
有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也同样适用。 如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。
如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。
反过来,
如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数的例外,在参考文档中有显式的说明)。
21.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
22.类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。
工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。
类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。 工厂方法则可以避免为可能没有用的对象盲目分配内存。
23.单件实例是什么
Foundation 和 Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如 NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。
24.动态绑定
—在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时, 特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。
25.obj-c的优缺点
objc优点:
1) Cateogies
2) Posing
3) 动态识别
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空间
2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
26.sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。
memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(void * dst,const void * src,size_t n); 将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。
27. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer 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) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument
and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions t
hat take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
28.readwrite,readonly,assign,retain,copy,nonatomic属性的作用
@property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
@synthesize xxx; 来实现实际代码
基本类型为:NSArray,NSSet以及NSDictionary
可变类型为:NSMutableArray,NSMutableSet以及NSMutableDictionary
在程序收到内存警告的时候会调用该方法
默认操作为检查controller是否可以安全地释放它的view(这里加粗的view指的是controller的view属性),比如view本身没有superview并且可以被很容易地重建(从nib或者loadView函数)
Frame指的是:该view在父view坐标系统中的位置和大小(参照点是父类的坐标系统)
Bounds指的是:该view在本身坐标系统中的位置和大小(参照点是本身的坐标系统)
没有多重继承。
cocoa中所有的类都是NSObject的子类,多继承在这里是用protocl委托代理来实现的,所以我们不用去考虑繁琐的多继承、虚基类的概念,多态特性在oc中拖过委托来实现。
二. c/c++
1.得到一个field在结构体中的偏移量
#define OFFSETOF(type, field) ((size_t)&(((type *)0)->field))
2.引用和指针的区别
1 .从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。引用访问一个变量是直接访问,而指针是间接访问。
2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域
3.从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改
3.写出float X 与零值比较的if语句
const double EPSILON = 1.00e-07;
if (x
4.如何引用一个已经定义过的全局变量
可以用引用头文件的方式,也可以用extern关键字的方式来引用定义过的全局变量
5.static全局变量与普通的区别,局部变量呢? 函数呢?
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
6.队列和栈的区别
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
1.队列先进先出,栈先进后出。
2. 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
3.遍历数据速度不同。队列遍历数据的速度要快得多。
7.写一个单链表 要求可以插入数据和删除单个数据
#include
#include
typedef struct Node //定义节点
{
int data; //可以为其他类型
struct Node *next;
}List;
void create(struct Node *&L,int a[],int n) //创建,L是链表头,a是要插入数组,n是要插入元素个数
{
List *s; int i; L=(List *)malloc(sizeof(List));
L->next=NULL;
for(i=0;i
s=(List *)malloc(sizeof(List));
s->data=a[i];
s->next=L->next; L->next=s;
}
}
int insert(List *&L,int i,int e) //插入,i是插入位置,e是插入的值
{
int j=0;
List *p=L,*s;
while(j
j++;
p=p->next;
}
if(p==NULL)
return 0;
else {
s=(List *)malloc(sizeof(List));
s->data=e;
s->next=p->next;
p->next=s; return 1;
}
}
int delete(List *&L,int i,int &e)//i是要删除元素的位置,e保存被删除元素的值
{
int j=0;
List *p=L,*q;
while(j
j++; p=p->next;
}
if(p==NULL)
return 0;
else {
q=p->next;
if(q==NULL)
return 0;
e=q->data;
p->next=q-> >next;
free(p);
return 1;
}
}
1、写出打印语句
NSLog();
2、解释类、对象、实例方法和实例成员
类:一类事物的抽象,有成员和方法。
对象:类的实例化和具体化
实例方法:主要和类方法区别,类方法声明时前面用加号,实例方法声明时用减号
实例成员:主要和类成员区分,类成员加static,实例成员不需要。
3、类名、方法名、成员名、函数名、宏定义首字母哪些大写,哪些小写
QFRootViewController
大写:类名,宏定义
小写:方法名,成员名,函数名
4、@public,@protected,@private区别
@public:完全公开,在程序的任何地方都可以调用
@private:和@public相反,只能在该类内部不调用
@protected:只有自己和自己的子类可以调用
5、如何声明一个带两个参数的实例方法和如何调用(举例说明)
声明:-(void)methodForParameter1:(NSString *)p1 parameter2:(NSString *)p2;
调用:[self methodForParameter1:@"" Parameter2:@""];
6、@property (nonatomic, retain) Example *example;
写出其setter和getter方法
getter
- (Example *)example { return _example; }
setter
-(void)setExample:(Example *)aExample
{
if (example != aExample)
{
[example release];
example = [aExample retain];
}
}
7、static关键字的作用,extern关键字的作用
static:定义全局变量;定义类成员;定义内部函数
extern:声明外部变量和外部函数,所声明的变量和函数可能不在本文件内定义或实现
8、解释self
self就是实例本身,在类里用self来调用自身的方法
9、什么时候使用继承?什么时候使用类别
给一个类增加新的数据成员时用继承
只是想扩展类的方法或覆盖原来的方法时用类别
10、如何声明一个类
@class Example或者
@interface Example
@end
11、写出1-2个与动态调用有关的方法
respondsToSelector 、performSelector、isKindOfClass conformsToProtocol、、isMemberOfClass
12、写一个协议(举例),协议有什么用
2个对象之间传值 协议 = 代理 接口/ 纯虚函数
oc没有多继承,oc是通过协议实现多继承 抽象类 c++
@protocol ExampleProtocol
- (void)exampleProtocol;
@end
ui 数据处理(平台无关)
@interface ExampleClass : NSObject
{
id
}
@property (nonatomic,assign) id
@end
一个通过协议对外提供接口。
Foundation
1、存放数字用哪个类,存放CGRect用什么类型
存放数字用NSNumber
存放CGRect用NSValue
2、快速枚举(举例)
快速到底快不快Cache 缓存
iOS缓存 sdwebimage http://xxx.com/a.jpg md5
Library/myimages, Documents, xxx.app Tmp
UIImage *img = [UIImage imageWithName:@"xxx.png"];
NSSTring *path = [NSBundle mainBundle] pathforresource:
NSData *d = [NSData datawithcontentsoffile:path];
uiimage *img = [[UIIMage alloc] initwithData:d];
// 图片缓存
nsfilemanager, nsfilehandle,
NSArray *array = [NSArray array];
for (id object in array)
{
[object test];
}
3、有哪些集合类和存放二进制数据类
NSArray/NSMutableArray,NSDictionary/NSMutableDictionary,NSSet/NSMutableSet/NSCountedSet,NSData存放二进制数据
4、文件处理用哪些类(写1-2个)
db, userdefaults, plist, file, nsarchieve,
// nsmutablearray/nsarray, nsmutabledictionary/nsdictionary, hash表
NSFileManager\NSUserDefaults open, fopen
5、解释retain、copy、assgin、autorelease
retain,copy:计数器加一,区别是retain是原对象计数器加一,copy是创建一个新对象后,新对象计数器加一
assgin:简单复制,计数器不变
autorelease:内存延迟释放,计数器延迟减一
6、写出归档相关类
NSKeyedArchiver、NSKeyedUnarchiver
7、写出xml解析和网络相关类
xml解析:NSXMLParser, kissXML GDATA
// SAX, DOM,
// 大文件下载
网络:NSurlConnection
8、常用的xml/json解析和http请求第三方包各写出一个
xml:kissxml
json:SBJSon
http请求:ASIHttpRequest SDWebImage, 异步图片加载器(界面流畅)
异步mp3 异步video
9、代理和通知的区别
代理是垂直的,通知可以平行的
1: 1 n:n
http://www.1000phone.com/x.rmvb
100M
nsurl *url = [nsurl urlwithstring:@"http://www.1000phone.com/x.rmvb"];
nsurlrequest *r = [nsurlrequest requestwithurl:url];
// 请求头 Range 20M-
[r addHeader:@"20M-" forHeader:@"Range"];
nsurlconnnection *c = [nsurlconnection alloc] initwithrequest:r];
你如何实现一个断点续传
// 只需要在http请求头上加一个Range字段即可
cocoa
1、写出iphone编程中常用控件类名(不用很准确,写出五个以上)
UILabel,UITextField,UITextView,UIButton,UISwitch, UISegmentedControl,UISlider,UIImageView ,UIScrollView,UITableView,UITabBarController,UINavigationController
2、写出几个常用的设计模式(两个以上)
MVC设计模式
单例模式
代理模式
通知模式
工厂模式
侯晨光群共享图片的笔试题答案
班德尔笔试题。
0. 你如何理解面向对象的
1 你是怎么理解delegate,举例如何使用
2,让你做个相册你会怎么做
3怎样自定义一个uiTabbarController
4你用过动画效果吗?请举例说明
5,实现一个Cell要有标题和内容
BookCell : uitableviewcell
NSDictionry BookModel
6 解释一下http,如何下载一张图片代码实现
照片没照清楚,题目我写在这儿了。
6.你怎样理解delegate的,并举例如何使用
7.简述对view,viewcontroller, calayer和window的理解
calayer是uiview内部的东图层管理,主要用来做动画
uiwindow本来就是一个uiview
8.让你做相册,你会怎么做
9.自定义Tabbar,你怎么做
10.使用过动画效果吗?请举例说明
上机是一道约瑟夫环问题
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i=0; i <10;i++) {
NSNumber *num = [NSNumber numberWithInt:i];
[array addObject:num];
}
int loopCount = 3;
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i=0; i <10;i++) {
int a = arc4random();
NSNumber *num = [NSNumber numberWithInt:a];
[array addObject:num];
}
NSArray *ret = [self sort:array];
for (NSNumber *n in ret) {
NSLog(@"num %d", [n intValue]);
}
viewDidLoad loadView
viewDidUnload
didReceiveMemoryWarning
知识⾯面 HR HumanResource 1.说所你了解以及⽇日常使⽤用的版本控制系统,以及它们的优 缺点
SVN 优点:除包括了 CVS 的大多数特点外,还有一些如:文 件目录可以方便的改名、基于数据库的版本库、操作速度提 升、权限管理更完善等功能非常好用。
SVN 缺点:代码库不是分布式,而是集中在一个地方,所以 导致跨国访问的时候速度很慢,远程发开非常不利。其次由 于代码库只有一份,特别是元数据都存在服务器上,所以当 服务器崩溃的时候损失严重。
GIT 优点:是免费、开源、它采用了分布式版本库的方式, 不必服务器端软件支持,使源代码的发布和交流极其方便。 每一个 GIT 克隆都是一个完整的文件库,含有全部历史记录 和修订追踪能力。其最大特色就是“分支”及“合并”操作 快速、简便。支持离线工作,GIT 是整个项目范围的原子提 交,而且 GIT 中的每个工作树都包含一个具有完整项目历史 的仓库。
GIT 缺点:对 windows 以及中文的支持不是很好。
2. 你通常以怎样的数据格式跟服务端做数据交换 JSON、XML,
Sbjson/touchjson/ 开源库 Gdata,
http
3. 写下你掌握的其他编程语言
C、C++、C#、JA V A、PHP、Ruby、 javascript, Lua,Python 等
4. 你了解的第三方库,常用哪些 Framework ASIHTTPRrequest、TXML、TouchJSON、MBProgressHUD、
EGOTableViewPullRefresh、FMDB、ZBarSDK、MinZIP
5. 你了解的设计模式
Classs Method、Abstract Factory、Singleton、Observer、 Prototype、MVC
写一个代理 代理, 单例 广播/通知中心
6. 平时会代码复用,或经常重构自己的代码吗? 会,为了提高软件质量、性能、软件的扩展性和维护性、使
其更加合理、uiimageview 不能点击框架 封装,继承 多态
iOS SDK:
1.如何实现 Push 通知的机制(大致写下)
1 ⽤用⺴⽹网站把要发送的消息、⺫⽬目的 iPhone 的标识打包,发给 APNS。
2APNS 在⾃自⾝身的已注册 Push 服务的 iPhone 列表中,查找 有相应标识的 iPhone,并把消息发到 iPhone。
3iPhone 把发来的消息传递给相应的应⽤用程序, 并且按照设 定弹出 Push 通知
2.Key-Value Coding 是什么?KVC 是通过字符串标识符间接访问对象属性和关系的机制。
5.说说 Auto Release Pool,内存管理模式, GC, retain count auto release pool 内存自动释放池。放到池中的会在失效后⾃自
动释放
内存管理模式:可以手动申请释放,使用 auto release pool, 使用 ARC
GC:Gabbage Collector 垃圾回收iOS 有没有 GC Gabage Collector 垃圾回收机制 mac os x 有 ios 没有retain count:内存计数器
技术题:1. 怎样实现一个 Memory Cache
alloc 太耗时间malloc(100);
malloc(200);
2. 如何在有一个属性名和值的情况,给一个对象赋值
对象名.属性名 = 值
obj.name = v;
3.GBK 如何转换为 UTF-8 (3 字节)
如何转成 Unicode.(2 字节)
NSStringEncoding eco=CFStringConvertEncodingToNSStringEncoding(
kCFStringEncodingGB_18030_2000); urlStr = [urlStr
stringByAddingPercentEscapesUsingEncoding:eco]; NSURL * url=[NSURL URLWithString:urlStr];
4.如何实现一个带删除线的 UILabel 用 CG 重绘 drawRectRTLabel 开源的富文本
5.如何让 imageNamed 同时兼容 3.x 及 4.x 系统,以及不失 去缓存
imageNamed 自动缓存不会消失
按照 3.X 和 4.X 的分辨率做两张图片,图片名相同需要支持 4.X 的图片名后加上@2X
test.png [email protected]
NSString *path = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"png"];
UIImage *iv = [[UIImage alloc] initWithContentsOfFile:path];
6.如何实现一个异步的 UIImageView 开启异步线程下载图片,或用三方库进行一步操作
7.如何实现像 Settings 一样的界面 用 TableView、UISwitch
8.如何实现滚动到底部自动加载,以及显示一个 loading cell
⽤用 scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate ⽅方法计算是否触底,调⽤用异步刷新事件 scrollViewDidScroll
9. 如何实现从外部打开程序在项目的 Info.plist 文件中 添加一个 URL types 节点就可以
了
[[UIApplication sharedApplication]
openURL:[NSURL
URLWithString:@"http://www.baidu.com"]];
[[UIApplication sharedApplication]
openURL:[NSURL
URLWithString:@"tel://18533221222"]];
[[UIApplication sharedApplication]
openURL:[NSURL
URLWithString:@"sms://18533221222"]];
10. 如何将图片添加到照片库
UIImage *img = [UIImage
imageWithNamed:@”123.ppng”];
UIImageWriteToSavedPhotosAlbum(img, nil,
nil, nil);
11. copy 与 retain 的区别 copy 复制一个对象retain 会让计数器+1
12. Undo, Redo 如何实现 UIMenuItem
13. NSCoding(archive,unarchive) -(id)initWithCoder:(NSCoder *)coder;
-(void) encodeWithCoder:(NSCoder*)coder;
加分题
1. 如何实现一个实现渲染自定义格式字符串的 UILabel CoreText. RTLabel
2 Protocol 与 performSelector: 的相同与区别,哪个更好(基 础参数类型传递)
Protocol 是协议,同时也走了 NSObject 的协议在 NSObject 协议中定义了很多基本的协议函数,其中包括 performSelector。
3.如果使⽤用多线程进⾏行编码 [nsthread detachXXXX];
[self
performSelectorInBackground:@selector(xxx)
withObject:xxx];
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
知识面 HR HumanResource
1.说所你了解以及日常使用的版本控制系统,以及它们的优缺点
SVN优点:除包括了CVS 的大多数特点外,还有一些如:文件目录可以方便的改名、基于数据库的版本库、操作速度提升、权限管理更完善等功能非常好用。
SVN缺点:代码库不是分布式,而是集中在一个地方,所以导致跨国访问的时候速度很慢,远程发开非常不利。其次由于代码库只有一份,特别是元数据都存在服务器上,所以当服务器崩溃的时候损失严重。
GIT优点:是免费、开源、它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。每一个GIT克隆都是一个完整的文件库,含有全部历史记录和修订追踪能力。其最大特色就是“分支”及“合并”操作快速、简便。支持离线工作,GIT是整个项目范围的原子提交,而且GIT中的每个工作树都包含一个具有完整项目历史的仓库。
GIT缺点:对windows以及中文的支持不是很好。
你通常以怎样的数据格式跟服务端做数据交换
JSON、XML,
Sbjson/touchjson/ 开源库
Gdata,
http
写下你掌握的其他编程语言
C、C++、C#、JAVA、PHP、Ruby、
javascript, Lua,Python 等
4. 你了解的第三方库,常用哪些 Framework
ASIHTTPRrequest、TXML、TouchJSON、MBProgressHUD、 EGOTableViewPullRefresh、FMDB、ZBarSDK、MinZIP
你了解的设计模式
Classs Method、Abstract Factory、Singleton、Observer、Prototype、MVC
写一个代理 代理, 单例 广播/通知中心
平时会代码复用,或经常重构自己的代码吗?
会,为了提高软件质量、性能、软件的扩展性和维护性、使其更加合理、
uiimageview 不能点击
框架 封装,继承 多态
iOS SDK:
如何实现Push 通知的机制(大致写下)
1用网站把要发送的消息、目的iPhone的标识打包,发给APNS。
2APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
3iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知
Key-Value Coding是什么?
KVC是通过字符串标识符间接访问对象属性和关系的机制。
说说Auto Release Pool,内存管理模式, GC, retain count
auto release pool内存自动释放池。放到池中的会在失效后自动释放
内存管理模式:可以手动申请释放,使用auto release pool,使用ARC
GC:Gabbage Collector垃圾回收
iOS 有没有GC Gabage Collector垃圾回收机制
mac os x 有 ios没有
retain count:内存计数器
技术题:
1. 怎样实现一个 Memory Cache
alloc 太耗时间
malloc(100);
malloc(200);
如何在有一个属性名和值的情况,给一个对象赋值
对象名.属性名 = 值
obj.name = v;
GBK 如何转换为 UTF-8 (3字节)
如何转成Unicode.(2字节)
NSStringEncoding eco=CFStringConvertEncodingToNSStringEncoding(
kCFStringEncodingGB_18030_2000);
urlStr = [urlStr
stringByAddingPercentEscapesUsingEncoding:eco];
NSURL * url=[NSURL URLWithString:urlStr];
如何实现一个带删除线的 UILabel
用CG重绘 drawRect
RTLabel 开源的富文本
如何让 imageNamed 同时兼容 3.x 及 4.x 系统,以及不失去缓存
imageNamed自动缓存不会消失
按照3.X和4.X的分辨率做两张图片,图片名相同需要支持4.X的图片名后加上@2X
test.png test@2x.png
NSString *path = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"png"];
UIImage *iv = [[UIImage alloc] initWithContentsOfFile:path];
如何实现一个异步的 UIImageView
开启异步线程下载图片,或用三方库进行一步操作
如何实现像 Settings 一样的界面
用TableView、UISwitch
如何实现滚动到底部自动加载,以及显示一个 loading cell
用scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate方法计算是否触底,调用异步刷新事件
scrollViewDidScroll
如何实现从外部打开程序
在项目的Info.plist文件中 添加一个 URL types 节点就可以了
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18533221222"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://18533221222"]];
10. 如何将图片添加到照片库
UIImage *img = [UIImage imageWithNamed:@”123.ppng”];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
copy 与 retain 的区别
copy复制一个对象
retain会让计数器+1
Undo, Redo 如何实现
UIMenuItem
NSCoding(archive,unarchive)
-(id)initWithCoder:(NSCoder *)coder;
-(void) encodeWithCoder:(NSCoder*)coder;
加分题
1. 如何实现一个实现渲染自定义格式字符串的 UILabel
CoreText. RTLabel
2 Protocol 与 performSelector: 的相同与区别,哪个更好(基础参数类型传递)
Protocol是协议,同时也走了NSObject的协议在NSObject协议中定义了很多基本的协议函数,其中包括performSelector。
如果使用多线程进行编码
[nsthread detachXXXX];
[self performSelectorInBackground:@selector(xxx) withObject:xxx];
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
delegate 为什么定义为 assign或者 如何避免循环引用,这个我们讲过,就说delegate如果设置为retain 可能会造成 2个对象相互retain,会造成循环应用,如果改成assign就没事了
1.关键字 retain 和 release 的 功能
retain 是对oc对象计数器+1
release是对oc对象计数器-1 减到0就自动调用oc对象的dealloc函数
2.请问关键字 alloc 和 init 的 区别
alloc是分配内存,对象计数器为1 init是初始化工作 类似于c++构造函数
3. 请问 property 的 作用,assign,copy,retain 的 区别;
assign就是基本赋值
copy是重新创建一个oc对象,计数器是1
retain是对计数器+1
4.请写出实现多线程操作涉及的类及 简单 示例;
NSThread, NSOperation, Blocks/GCD, pthread都是多线程操作函数
常用 NSThread detachNewThreadSelector
NSOperation是在网络上用的多写 继承NSOperation 实现了main函数
Blocks是也是工作线程
5.请描述ios开发中 xml解析涉及的类
我在开发中用json比较多
6.请简述 kvo及其优势
可以观察某个变量的变化
7.请 分别简述 notification 的 同步和 异步的调用 方法
是广播模式/观察者模式,可以异步查看系统或者自定义一些事件
8.如何调用 UIView 的 drawrect 消息
定制uiview直接用图形画底层控件一般用drawRect:(CGRect)rect;
我用的很少 我一般组合定制控件
9. view 和 viewcontroller 的 关系
UIviewController其实相当于一个容器,一个控制器,里面包含了一个根的uiview
M(MutableArray DB) C V
二
1.请给出 new 和 malloc 的 区别
c++创建对象new
c创建对象malloc 其实差不多
2.用static 修饰 的 变量和 函数的 意义 分别是 什么
static 可以修饰函数作用域,
static修饰变量作用域 或者文件内全局/局部变量
有时候有static inline混在一起内联编译
3.在 那 中 情况下 会调用 copy 构造函数 ? 什么样的 类应该 定义copy 构造函数
4.析构函数是 否 应该定义 virtual 为什么
应该, 析构函数都应该定义为virtual
三
1 请实现 一个简单的工厂模式 和 一个 单例模式
2. 类a 要利用类b 的 功能,有哪几种方法及 各自的 有点
四
1.请编写 一个类, 输入一串阿拉伯数字字符串 输出为 用汉字 字符串表述的 这个
例如 输入 “13204”,读出 一万三千二百零四
五
1 请实现数组排序函数 void sort(int【】array,int length),array 为待排序数组,length 维数组长度
2 请 写一个 用 二分法对有序的 数值型数组进行快速查找
int search(int array[],int length, int v);
六
1 http 协议,get, post区别
get是简单的http协议
post是从客户端提交复杂的参数,包括文件
2.如何判断一个 http 包结束
一般在http请求投有content-length是表示后面数据有多长
oc中有 connectionDidFinishLoading表示接受完成
当然也可以根据接收多少了
3 http 协议如何实现断点下载的
使用http Range字段
可以把当前传输了多少存在文件中,
4 如何防止盗链 Refer
5 简单描述 http 的 标准cgi请求的 处理过程
自己写过一个cgi的程序,用oc和c
6.请描述tcp协议的 三次 捂手流程
socket
7 请 描述您对select 模型的 理解
优朋普乐面试题
Ios
多线程下载用到的类和方法
解析xml 用到的类和方法
Notification 的同步和异步实现过程
怎么调用UIView 的drawRect
自定义label使其文字默认为左上角开始显示
自定义UITableViewCell ,使其左边为一个UIImageView
C++
new 和 malloc 区别
Static 修饰的变量和函数的用法
Copy构造函数的用途和用法
析构函数可以为虚函数吗?为什么?
模式
kvo 是什么?有什么优势?
写一个工厂模式的类和单例模式的类。
编程
不知道总结点数,只遍历一次链表就找出中间的节点,写出节点结构体
多杈树结构的数据结构表示,编程使用户选定其中一个节点就能打印出他下面的所有节点名称
drawRect绘完时,怎么重新加载,应该是这个答案,面试的人问的不是很清
view setneeddisplay或者 setneedsdisplayinrect:cgrect
智力题:硬币正反面概率问题,正面放入箱子,反面从箱子中拿出一个(不为零时),问多少次后箱子里有十个硬币?
layoutSubViews 可以在自己定制的视图中重载这个方法,用来调整子视图的尺寸和位置。
那面试官,问的时候是这么问的子视图相对父视图,父视图改变时子视图也跟这改变
Iphone工程师笔试试题
1.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不是首地址+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].
2. 以下为32位C++程序,请计算sizeof的值
void Func ( char str[100] )
{
sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
这题很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。
3.还是考指针,不过我对cocoa的代码还是不太熟悉
大概是这样的
- (void)*getNSString(const NSString * inputString)
{
HYPERLINK "mailto:*output=@%22This%20" inputString = @"This is a main test\n";
return ;
}
-main(void)
{
NSString HYPERLINK "mailto:*a=@%22Main%20" *a=@"Main";
NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n", aString);
}
最后问输出的字符串:NULL,output在函数返回后,内存已经被释放。
4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
•; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
•; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
•; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
•; 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
写一个"标准"宏MIN
,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B)
((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
•;
标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方
法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
•; 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else
更优化的代码,了解这个用法是很重要的。
•; 懂得在宏中小心地把参数用括号括起来
•;
我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
least = MIN(*p++, b);
结果是:
((*p++) <= (b) ? (*p++) : (*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
5.写一个委托的interface
@protocol MyDelegate;
@interface MyClass: NSObject
{
id
}
// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
6.写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
+ (id) stringWithCString: (const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
7.obj-c有多重继承么?不是的话有什么替代方法?
cocoa 中所有的类都是NSObject 的子类
多继承在这里是用protocol 委托代理 来实现的
你不用去考虑繁琐的多继承 ,虚基类的概念.
ood的多态特性 在 obj-c 中通过委托来实现.
8.obj-c有私有方法么?私有变量呢
objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) //category
- (void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的
9.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用
const意味着"只读",下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:
•; 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果
你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清
理的。)
•; 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
•; 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
(1)欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
(3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到
这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
•; 并行设备的硬件寄存器(如:状态寄存器)
•; 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
•; 多线程应用中被几个任务共享的变量
•; 一个参数既可以是const还可以是volatile吗?解释为什么。
•; 一个指针可以是volatile 吗?解释为什么。
下面是答案:
•; 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
•; 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
static 关键字的作用:
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
extern "C" 的作用
(1)被 extern "C"限定的函数或变量是 extern 类型的;
extern 是 C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,
其声明的函数和变量可以在本模块或其它模块中使用。
(2)被 extern "C"修饰的变量和函数是按照 C 语言方式编译和连接的;
extern "C"的惯用法
(1)在 C++中引用 C 语言中的函数和变量,在包含 C 语言头文件(假设为 cExample.h)时,需进
行下列处理:
extern "C"
{
#include "cExample.h"
}
而在 C 语言的头文件中,对其外部函数只能指定为 extern 类型,C 语言中不支持 extern "C"声明,
在.c 文件中包含了 extern "C"时会出现编译语法错误。
(2)在 C 中引用 C++语言中的函数和变量时,C++的头文件需添加 extern "C",但是在 C 语言中不
能直接引用声明了 extern "C"的该头文件,应该仅将 C 文件中将 C++中定义的 extern "C"函数声明为
extern 类型。
10.为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止该头文件被重复引用。
11.#import跟#include的区别,@class呢?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import
而#import比起#include的好处就是不会引起交叉编译
12.MVC模式的理解
MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的协调者。
13.线程与进程的区别和联系?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
14.列举几种进程的同步机制,并比较其优缺点。
答案: 原子操作 信号量机制 自旋锁 管程,会合,分布式系统
进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
进a程死锁的原因
答案:资源竞争及进程推进顺序非法
死锁的4个必要条件
答案:互斥、请求保持、不可剥夺、环路
死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
15.堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
16.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的
性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型
实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相
关对象的特定属性。
For example, the key path address.streetwould get the value of the address property from the receiving
object, and then determine the street property relative to the address object.
17.c和obj-c如何混用
1)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.目标-动作机制
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)
的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
19.cocoa touch框架
iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知当前位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:
Core Animation
通过 Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是 Cocoa Touch 中一小部分可用的框架:
音频和视频
Core Audio
OpenAL
Media Library
AV Foundation
数据管理
Core Data
SQLite
图形和动画
Core Animation
OpenGL ES
Quartz 2D
网络/li>
Bonjour
WebKit
BSD Sockets
用户应用
Address Book
Core Location
Map Kit
Store Kit
20.objc的内存管理
如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥
有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也同样适用。 如果您拷贝一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。
如果您保持一个对象,您就部分拥有这个对象,需要在不再使用时释放该对象。
反过来,
如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该释放它(这个规则有少数的例外,在参考文档中有显式的说明)。
21.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
22.类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。
工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对象的分配信息。
类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一个类在每次程序运行过程只存在一个实例,但它需要首先分配一个“生的”实例,然后还必须释放该实例。 工厂方法则可以避免为可能没有用的对象盲目分配内存。
23.单例模式是什么
Foundation 和 Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如 NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。
24.动态绑定
—在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时, 特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。
25.obj-c的优缺点
objc优点:
1) Cateogies
2) Posing
3) 动态识别
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空间
2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
26.sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。
memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(void * dst,const void * src,size_t n); 将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。
27. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer 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) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument
and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions t
hat take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
28.readwrite,readonly,assign,retain,copy,nonatomic属性的作用
@property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
@synthesize xxx; 来实现实际代码