1,Objective-C的内存管理方式, NSAutoreleasePool的作用
NSAutoreleasePool是用于管理iphone应用的生命周期内所有的自动释放对象。当应用程序中有自动对象创建时,该对象就会被加入到该自动释放池。当应用程序结束时,该池会释放池中全部的自动释放对象[pool release];
在 Objective-C中每个对象都对应着他们自己的持有计数(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加。相反,当你像一个对象发送release消息时,持有计数数值会减小。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。
2,写一个retain方式声名属性的setter方法// retain
-(void)setMyObject:(id)newValue{
if (_myObject != newValue) {
[_myObject release];
_myObject = [newValue retain];
}
}
4,列出你常用的几个设计模式,列出如何在Objective-C中实现与应用
5,drawRect,lasyoutSubViews的区别
当调用view的setNeedsDisplay时,系统异步调用drawRect方法,并绘制图形的上下文供在此方法内使用Quartz2DAPI。
当调用view的setNeedsLayout时,系统异步调用layoutSubviews方法,但不配制图形上下文,只做页面布局使用
6,列举Cocoa中常用的几种多线程实现,并谈谈多线程安全问题的几种解决方案,什么地方会用到多线程
1. ViewController的didReceiveMemoryWarning怎么被调用:
[supper didReceiveMemoryWarning];
2.什么时候用delegate,什么时候用Notification?
delegate针对one-to-one关系,用于sender接受到reciever的某个功能反馈值。
notification针对one-to-one/many/none,reciver,用于通知多个object某个事件。
3.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
#define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
4.写一个委托的interface
@protocol MyDelegate;
@interface MyClass: NSObject{
id <MyDelegate> delegate;
}// 委托方法
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
6.obj-c有多重继承么?不是的话有什么替代方法?
cocoa 中所有的类都是NSObject的子类
多继承在这里是用protocol委托代理 来实现的
你不用去考虑繁琐的多继承 ,虚基类的概念.
ood的多态特性 在 obj-c 中通过委托来实现.
7.obj-c有私有方法么?私有变量呢
objective-c- 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法
@interface Controller : NSObject {
NSString *something;
}
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private)
-(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的。
8.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用
const 意味着"只读",
关键字volatile有什么含意?并给出三个不同的例子。
一个定义为 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
10.为什么标准头文件都有类似以下的结构?
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。
10.#import跟#include的区别,@class呢? #import<> 跟 #import""又什么区别
@class一般用于头文件.h中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import。而#import比起#include的好处就是不会引起交叉编译。注意引入系统的头文件或框架时用尖括号<>,引入代码中的其他自己编写的头文件时,是工程的一部分,用双引号:
10、1、为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain?
如果是retain会引起循环引用。所有的引用计数系统,都存在循环引用的问题。
10、2、对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别时什么类型的对象?编译的时候时NSData 类型.运行时候 testObject 被强制转换为NSString.
10、3、什么时安全释放
释放对象的时候将指针置空.避免出现野指针,该释放的时候释放:释放钱指针指向空,并且检查类型这个是安全释放的意思
11.MVC模式的理解,本质是观察者模式。
MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。
模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。
控制器对象是应用程序的视图对象和模型对象之间的协调者。
12.线程与进程的区别和联系?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
13.列举几种进程的同步机制,并比较其优缺点。
答案: 原子操作信号量机制 自旋锁 管程,会合,分布式系统
1.进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
2.进程死锁的原因
答案:资源竞争及进程推进顺序非法
3.死锁的4个必要条件
答案:互斥、请求保持、不可剥夺、环路
4.死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
14.堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
16.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编写的模块是我们想要的。
如果模块以类实现,那么要按照cppclass的标准写类的定义,头文件中不能出现obj-c的东西,包括#importcocoa的。
实现文件中,即类的实现代码中可以使用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.
17.cocoatouch框架
iPhone OS 应用程序的基础 CocoaTouch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。
UIKit为您提供了在 iPhoneOS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,
包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,
以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,
甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知当前位置。
CocoaTouch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:
Core Animation:通过 CoreAnimation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio:Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是 CocoaTouch 中一小部分可用的框架:
音频和视频: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
18.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。drain只是用于清除pool中对象,不会销毁池,release先调用drain方法清理对象,然后再释放自己内存。在IOS的非GC环境中,两者相同。
1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的.
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
19.objc优点:
1) Cateogies 2) Posing 3) 动态识别、动态类型id
4) 指标计算 5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言 7)Objective-C 与 C++ 可混合编程
objc缺点:
1) 不支援命名空間 2) 不支持运算符重载 3) 不支持多重继承 4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
22.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。
这是为了减少对上下文的依赖而引入的机制。
retain是指针拷贝,copy是内容拷贝。
assign就不用说了,因为基本上是为简单数据类型准备的,例如CGPoint、CGFloat等,而不是NS对象
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法
都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
23.http和scoket通信的区别。
http是客户端用http协议进行请求,发送请求时候需要封装http请求头,并绑定请求的数据,服务器一般有web服务器配合(当然也非绝 对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。服务器不能主动给客户端响应(除非采取http长连接 技术)。iphone主要使用类是NSUrlConnection。
scoket是客户端跟服务器直接使用socket
TCP/IP的socket提供下列三种类型套接字。流式套接字、数据报式套接字、原始式套接字。客户端编程步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
常用第三方库:1,Asyncsocket库
“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连接通道,双方都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef。
24.mvc设计模式是什么? 你还熟悉什么设计模式?
设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,
用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。面向对象编程中,java已经归纳了23中设计模式。
mvc设计模式 ,模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。 Iphone本身的设计思想就是遵循mvc设计模式。其不属于23中设计模式范畴。
代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.
常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛应用.
单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,
这样有利于我们协调系统整体的行为,比如想获得[UIApplicationsharedApplication];任何地方调用都可以得到 UIApplication的对象,
这个对象是全局唯一的。
观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,
当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。
26.什么是push(了解一下)。
客户端程序留下后门端口,客户端总是监听针对这个后门的请求,于是 服务器可以主动像这个端口推送消息。 Apn ,deviceToken,证书,每隔15分钟进行一次保活的握手
28.fmmpeg框架(了解一下)
(音视频编解码框架,内部使用UDP协议针对流媒体开发,内部开辟了六个端口来接受流媒体数据,完成快速接受之目的).
31.什么是沙箱模型?哪些操作是属于私有api范畴?
某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越。
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.
documents,tmp,app,Library。
(NSHomeDirectory()),手动保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夹里 iphone常见私有api的应用
(比如直接发送短信,访问沙箱之外的磁盘文件).
32.你在开发项目中时,用到了哪些数据存储方式,iphone中常见的方式有哪些,各有什么区别?数据存储五种形式的应用范围和性能区别
(core data, sqllite,对象序列化,文件直接读写,NSUserDefault(保存数据到temp文件夹中))
文件直接读写>core data> 对象序列化> sqllite>NSUserDefault.
CoreData不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS), CoreData是对sqlite数据库的一个封装.
33.线程的常见方法有哪些,你是如何处理多线程的,多线程同步问题你了解么?
线程创建的几种方式,线程的加锁,休眠,唤醒,解锁,退出,
多线程要考虑同步问题,解决同步问题的方式就是对某一资源加锁,当一个线程操作本资源时,其他线程不能操作 。
40.分线程回调主线程方法是什么,有什么作用?
[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nilwaitUntilDone:YES];
[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread]withObject:nil waitUntilDone:YES];
需要即时刷新ui控件的时候,经常使用。
41.iphone阅读器,如果要读取一个文本文件,请问你是如何处理编码问题的?另外像pdf格式的文件,你如何读取。?
iphone手机阅读器中对于PDF格式的阅读,可以直接用UIWebView控件显示,也可以从网上下到很多直接读取pdf格式的代码 直接从pdf中得到数据。
答:NSThread三种方法
b. 主分线程
答:启动分线程,上面已提到!加到主线程方法performSelector! //加到主线程addData()是主线程的方法!只有加到主线程后,才能调用主线程的方法
//没有加到主线程后,调用主线程的方法!一定会崩!
c.线程锁答:NSCondition方法:
[thread lock];//加锁
sleep(n);//线程休眠
[thread singnal];//相当于通知,线程启动
[thread unlock];//解锁
[thread exit];//线程退出
54.各种 排序算法?希尔排序、快速排序、冒泡排序、
56. 为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?
答:retain会引起循环引用
57. 以下每行代码执行后,person对象的retain count分别是多少?
Person *person = [[Person alloc] init]; count1 [person retain];retain count 2
[person release];retain count 1 [personrelease];retain count = 0
58.在一个对象的方法里面:self.name = “object”;和name =”object”有什么不同吗?
答:self.name = "object"会调用对象的setName()方法,会使object引用计数加1,name = "object"会直接把object赋值给当前对象的name 属性,引用计数不增加。
59.readwrite,readonly,assign,retain,copy,nonatomic属性的作用?
@property是一个属性访问声明,扩号内支持以下几个属性: 1,getter=getterName,setter=setterName,设置setter与getter的方法名 2,readwrite,readonly,设置可供访问级别
3,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题 4,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
5,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
6,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的…)。
7,@synthesizexxx; 来实现实际代码
60.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].
IPHONE 使用NSCondition来进行线程同步,它是IPHONE的锁对象,用来保护当前访问的资源.大致使用方法
NSCondition*mYLock = [[NSCondition alloc] init];
[mYLock lock]
资源....
[mYLock unLock];
[mYLock release];iOS中后台运行处理
Info.plist中添加UIBackgroundModes键值,它包含一个或多个string的值,包括
audio:在后台提供声音播放功能,包括音频流和播放视频时的声音
location:在后台可以保持用户的位置信息,后台GPS跟踪
voip:在后台使用VOIP功能,长连接到服务器
IPHONE 使用NSCondition来进行线程同步,它是IPHONE的锁对象,用来保护当前访问的资源.大致使用方法
自动计数(ARC)
1,arc的设置是在build phases中修改compiler Flags的值。
2,如果使用了arc,在你的代码中不可以使用retain,release, autorelease,如果使用的话会报错。
3,如果使用了arc,在@property声明中,用strong和weak代替相应的retain, copy,和assign。
4,如果使用了arc,NSAutoReleasePool也不能使用,测试发现,用@autoreleasepool 代替,不会编译报错。
1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么?
所谓数字对象个人理解应该是类似java中Integer,Long,Float等等,在OC中NSNumber是数字对象,可以进行拆装箱操作!
//将int转为NSNumber
NSNumber *num =[NSNumber numberWithInt:123]//得到一个int
int testNum =[num intValue];
2.用NSLog打印一个浮点数,保留两位小数,结果四舍五入
注意,其实NSInteger,CGFloat这些都是Fundation框架下的名称,跟咱们用的int和float一样。NSLog(@"保留两位小数:%.2f",4.8356);
3.截取字符串”20|http://zcw-java.iteye.com“ 中 ‘|’字符前面及后面的数据,分别输出它们
如果字符串是|20|3020|20|||40|这样的,那么就需要另一种方式了
首先按照|符号进行分割
NSArray *array =[str componentsSeparatedByString:@"|"];
6.在一个对象的方法里面:self.name = “object”;和name =”object”有什么不同吗?
这个比较重要,self.name="object"隐式调用了set方法,所以这里如果你的set是自己写的,那么一定不要在set里self.name=name;这样的语法会造成死循环,还会使retainCount(引用计数+1)
name=“object”,直接赋值!引用计数不变
引用计数+1的情况
首先就列举下会使retaincount+1的操作:alloc/new/copy/mutablecopy/retain
alloc,allocWithZone, new(带初始化)为对象分配内存retaincount为1
copy,mutableCopy 复制一个实例,retaincount为1(被复制对象retaincount不变)
retain retaincount+1
另外,名字中带有alloc, copy, retain 字串的函数也都认为会为引用计数加一。。
使retaincount-1的操作:
release 基本上我只用这个
autorelease 这个我基本不用,很不稳定(不过可以和NSAutoreleasePool一起用似乎效果不错,后面会有介绍;不过我不喜欢)
对于alloc/new/copy/mutablecopy产生的对象要负责release掉,因为这些方法会加引用计数.
strong 和weak
iOS 5 中对属性的设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC)
strong 用来修饰强引用的属性retain;
@property (strong) SomeClass * aObject;
对应原来的
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;
weak 用来修饰弱引用的属性assign;
@property (weak) SomeClass * aObject;
对应原来的
@property (assign) SomeClass * aObject;
7.定义属性时,什么情况使用copy,assign,和retain
assign用于简单数据类型,如NSInteger,double,bool。
retain 和copy用户对象,copy用于当 a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy 的方式,a和b各自有自己的内存,就可以解决这个问题。retain 会使计数器加一,也可以解决assign的问题。另外:tomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。
8.viewDidLoad,viewDidUnload,dealloc,viewWillAppear,viewWillDisappear
1、viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用
例如动态在view添加一个按钮等
2、viewDidUnload当系统内存吃紧的时候会调用该方法,在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了)在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等 release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统release view时已经将其release掉了)这里需要说明Unload在3.0之后被广泛使用,现在已经很少用didReceiveMemoryWarning,
3、dealloc方法,viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情流程应该是这样(loadView/nib文件)来加载view到内存-->viewDidLoad函数进一步初始化这些view-->内存不足时,调用viewDidUnload函数释放views -->当需要使用view时有回到第一步如此循环
4、viewWillAppear方法,视图即将过渡到屏幕上时调用,(一般在返回需要刷新页面时,我都选择使用代理,所以很少用到)
5、viewWillDisappear方法,这个A->B之后,A在B之后的操作
3。frame 和 bounds 的 区别 ,bound的大小改变frame 改变吗?
frame和bounds是UIView中的两个属性(property)。frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
希尔排序; 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面,由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
void bubble_sort(int a[],int n) { int i,j,temp;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--) {
if(a[j]<a[j-1]) {
temp=a[j]; a[j]=a[j-1]; a[j-1]=temp;
} } } }
直接插入排序:插入排序(InsertionSort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
选择排序: 基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完
33、asihttp代码原理 ,异步请求的原理,异步请求最大数目,为什么只能这么多
asihttp最多4个异步请求,MKNetworkKit wifi最多6个,3g 为2个
10。uiview的圆角属性设置方法。
(m_mainImgView.layer.cornerRadius= 6;
m_mainImgView.layer.masksToBounds = YES;)
11、正则表达式
. 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束
^ 匹配字符串的开始 $ 匹配字符串的结束
验证InternetURL 正则表达式:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
//单例模式
+ (Global *)sharedSingleton{
staticGlobal *sharedSingleton;
@synchronized(self){
if(!sharedSingleton){
sharedSingleton= [[Global alloc] init];
}
returnsharedSingleton;
}
}
IOS 扩展机制
category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;
objc_getAssociatedObject、objc_setAssociatedObject、 objc_removeAssociatedObjects都是Obj-c中的外联方法,object 参数作为待扩展的对象实例,key作为该对象实例的属性的键,而value就是对象实例的属性的值,policy作为关联的策略
装饰者模式,适配器模式,外观模式三者之间的区别:
装饰者模式的话,它并不会改变接口,而是将一个一个的接口进行装饰,也就是添加新的功能。适配器模式是将一个接口通过适配来间接转换为另一个接口。外观模式的话,其主要是提供一个整洁的一致的接口给客户端。
IOS 的设计模式
1、 单例模式sharedSingleton
2、 观察者模式 NSNotification
3、 MVC本质也是观察者模式
4、 委托模式delegation ,通过protocol实现
5、 target-action模式,target-action模式一般用于自定义的controller按照应用规范定义的方式处理action message。
6、 工厂模式,抽象工厂,在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。
MobileSubstrate介绍
MobileSubstrate 实际上是一个框架,允许第三方的开发者在系统的方法里打一些运行时补丁,扩展一些方法.类
MobileSubstrate 主要有3部分组成. MobileHooker, MobileLoader和 safe mode.
1MobileHooker
MobileHooker 用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩). 将使用到2个API:
void MSHookMessageEx(Class class, SELselector, IMP replacement, IMP *result);
void MSHookFunction(void* function, void* replacement, void** p_original);
2 MobileLoader
MobileLoader 加载第三方补丁代码在运行的应用程序中。
MobileLoader 先加载它自己在运行的应用程序中时使用DYLD_INSERT_LIBRARIES 环境变量。然后查看所有动态库在目录/Library/MobileSubstrate/DynamicLibraries/
对于标识的应用程序,由于所有嵌入的环境变量被忽略,开发者的应用程序必须明确的dlopen("/Library/MobileSubstrate/MobileSubstrate.dylib")让MobileLoader 运行.
3 Safe mode
当一个扩展在SpringBoard崩溃, MobileLoader 会进入设备的安全模式捕捉并且处理。在安全模式下,所有的第三放扩展将失效.
iphone 守护进程优化与详解
守护进程(Launchdaemons) 后台进程的启动程序都存放在"/System/Library/LaunchDaemon"目录下, 就是那些".plist"文件 要不启动这些进程的最简单的方法就是删除相应的".plist"文件. 但最好在删除之前先要备份, 以防万一(备份整个Launchdaemons文件夹)
/System/Library/LaunchDaemon
反编译 SpringBoard桌面管理器,Ip设置等
class-dump –H System/Library/CoreServices/SpringBoard.app 或 IPConfiguration.bundle等
hook SpringBoard监听程序要点
1、substrate.h 和 Classdump 出的SpringBoard目录文件 放到
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include下边。
2、打包成app之后将解压后的可执行文件改成xxx.dylib,与相应.plist一起放到/Library/MobileSubstrate/DynamicLibraries/下边
//GCD多线程 Grand Central Dispatch 大中央调度,是一套低层API,GCD的API很大程度上基于block
GCD中有三种队列类型:
The main queue: 与主线程功能相同。实际上,提交至mainqueue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。一般用来在主线程上更新界面。
Globalqueues: 全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
用户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列,所以我们称其为用户队列) 是用函数 dispatch_queue_create创建的队列.这些队列是串行的。正因为如此,它们可以用来完成同步机制, 有点像传统线程中的mutex。
#define BACKGRAND(block)
dispatch_async(dispatch_get_global_queue(DIS_DEFAULT, 0), block)
#define MAIN(block)dispatch_async(dispatch_get_main_queue(),block)
dispatch_queue_t dispatchQueue =dispatch_queue_create("dispatch_queue", NULL);
GCD学习(3):dispatch_group
一个dispatch group可以用来将多个block组成一组以监测这些Block全部完成或者等待全部完成时发出的消息(主要用来平行操作组元素)
1. dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2. dispatch_group_t group = dispatch_group_create();
3. for(id obj in array)
4. dispatch_group_async(group, queue, ^{
5. [self doSomethingIntensiveWith:obj];
6. });
7. //等group里的task都执行完后执行notify方法里的内容,相当于把wait方法及之后要执行的代码合到一起了
8. dispatch_group_notify(group, queue, ^{
9. [self doSomethingWith:array];
10. });
11. dispatch_release(group);
不仅所有数组元素都会被平行操作,后续的操作也会异步执行,并且这些异步运算都会将程序的其他部分考虑在内。
iOS系统GCD学习(4):dispatch_group2
对于同步执行,GCD提供了一个简化方法叫做dispatch_apply。这个函数调用单一block多次,并平行运算,然后等待所有运算结束。注意:dispatch_apply函数可是没有异步版本的
GCD学习(5):信号量机制
在GCD中有三个函数是semaphore的操作,分别是:
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
简单示例
iOS系统GCD学习(10):常见错误
第一个错误,UI更新只能在主线程中
第二个错误,NSManagedObjectContext并不是线程安全的,gcd中访问成员变量有危险
第三个错误,队列创建后没有释放,内存泄露
简述push原理,push的证书和其它的右什么不一样?
第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
71. ObjC中,与alloc语义相反的方法是dealloc还是release?与retain语义相反的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
alloc与dealloc语意相反,alloc是创建变量,dealloc是释放变量。 retain 对应release,retain保留一个对象。调用之后,变量的计数加1。
5. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
答:线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;
在主线程执行代码,方法是performSelectorOnMainThread,
如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:或者dispatch_after或者NSTimer
6、iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法。下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:
1, Thread; NSThread
2, Cocoa operations; NSOperation
3, Grand Central Dispatch (GCD) (iOS4 才开始支持)
下面简要说明这三种不同范式:
Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread:
Cocoa threads: 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程。
[self performSelectorInBackground:@selector(startAutoMerge) withObject:nil];创建一个后台线程。
[self performSelectorOnMainThread:@selector(allContactsChangeBegin) withObject:nil waitUntilDone:NO];回到主线程更新界面
如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式。
POSIX threads: 基于 C 语言的一个多线程库,
POSIX thread 简称为pthread,POSIX是一个标准,是开发跨平台多线程的最佳方法。它是基于c语言的,很高效也很方便。
POSIX标准包括3方面的内容,1,线程管理。2,互斥量(mutex)。3,条件变量(condition variables)
pthread_t, 这个结构来标识线程ID;
pthread_mutex_t, 这个用来做互斥;
pthread_self() : 获得线程自身的ID;
pthread_create(&ntid, NULL, thr_fn, NULL): 线程创建函数
Cocoa operations是基于 Obective-C实现的,类 NSOperation 以面向对象的方式封装了用户需要执行的操作,我们只要聚焦于我们需要做的事情,而不必太操心线程的管理,同步等事情,因为NSOperation已经为我们封装了这些事情。 NSOperation 是一个抽象基类,我们必须使用它的子类。iOS 提供了两种默认实现:NSInvocationOperation 和 NSBlockOperation。
NSInvocationOperation *invoCation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadContactImg:) object:indexPath];
[self.operationQueue addOperation:invoCation];
NSBlockOperation* bop = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation in block"); }];
[self.operationQueue addOperation:bop];
Grand Central Dispatch (GCD): iOS4 才开始支持,它提供了一些新的特性,以及运行库来支持多核并行编程,它的关注点更高:如何在多个 cpu 上提升效率。
一般情况下都要用以上语句来防止父类改变对象的内存地址导致self指针指向无效内存。
1、MVC设计框架。低耦合,按模块开发。可复用部分,定制界面模板,通用网络模块。
2、GCD多线程处理,block编程,主流开源框架。
3、搜索算法设计。
设计模式:代理模式、观察者模式、工厂模式、单例模式、模板模式、组合模式。
分层架构设计:表示层、业务逻辑层、数据持久层,对应MVC。
ARC变量限定词:__strong,__weak,__unsafe_unretained和__autoreleasing
iOS5以下没有__weak
,则需使用__unsafe_unretained
,这个会造成野指针内存crash,要慎用。
在ARC中,__block
会自动进行retain
在非ARC中,__block
不会自动进行retain
__autoreleasing则可以使对像延迟释放
敏捷开发中涵盖多种开发元素:迭代开发,增量交付,测试驱动,结对编程,Usecase驱动,持续集成,重构等
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
Objective-C与C的区别有哪些
1, 两者最大的相同便是: 都是从 C 演化而来的面向对象语言, 两者都兼容标准 C 语言.
2, 两者最大的不同便是:Objective C 是完全动态的,而 C++是部分动态的。
Objective C 支持在运行时动态类型决议(dynamictyping),动态绑定(dynamicbinding)以及动态装载(dynamicloading);
3, Objective C 不支持多重继承, 而 C++ 支持。不过 Objective C 通过 proxy(代理) 或 Category(类别) 可以更优雅地实现这一特性。这一点也包括了 overwriting(覆盖) 和 overloading(重载) 两者的不同。Objective C 不支持函数重载。
4, 函数名字解析也不同,ObjectiveC 的函数名字解析是函数名称 +参数名称的, 而 C++ 只包括函数名称。
5, Objective-C 没有 C++ 里有的构造函数和析构函数, 其对应物为 alloc-init/dealloc;
6, Objective-C 2.0 了加入了垃圾回收机制(在 iPhone 和 iPad 上不可用),而 C++ 没有;
7, Objective-C 不允许在 Stack 上分配内存,只能在 heap 上进行,而 C++ 两者都允许;
8, Objective-C 不支持模板,而 C++ 支持;Objective-C 不支持命名空间,而 C++ 支持;Objective-C 也不支持函数缺省默认参数,而 C++ 支持;
10, Objective-C 是 Smalltalk 系的, 而 C++ 是 Simula 系的。
可以这么说Objective-C 在 C 之上进行了一层简洁的包装, 而 C++ 在 C++ 之上进行了复杂的包装, 但 Objective-C 让人感觉更优雅简洁。
---------------------------------------
对于标量
__block 可以在block内部改变外部标量