Object-C有多继承吗?没有的话用什么代替? cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的
objective-c– 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法 @private可以用来修饰私有变量 关键字const什么含义 const意味着”只读”,下面的声明都是什么意思? 前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。 结论: 欲阻止一个变量被改变,可以使用 const 关键字。在定义该const 变量时,通常需要对它进行初 关键字volatile有什么含义?并给出三个不同例子? 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到 · 一个参数既可以是const还可以是volatile吗?解释为什么。 下面是答案: static作用? 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, #import和#include的区别,@class代表什么? @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import 线程和进程的区别? 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 堆和栈的区别? 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。 Object-C的内存管理? 1.当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁. 为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain? 循环引用 定义属性时,什么情况使用copy、assign、retain? assign用于简单数据类型,如NSInteger,double,bool, 对象是什么时候被release的? 引用计数为0时。 iOS有没有垃圾回收? Objective-C 2.0也是有垃圾回收机制的,但是只能在Mac OS X Leopard10.5 以上的版本使用。 tableView的重用机制? 查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。 TableView显示之初,reusableTableCells为空,那么tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。 比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是: 1. 用[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。 2. 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。 3. 接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableViewdequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。
由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起 loadView方法 loadView和IB构建view viewDidLoad方法 viewDidUnload方法 在该方法中释放其他与view有关的对象、其他在运行时创建(但非系统必须)的对象、在viewDidLoad中被创建的对象、缓存数据等 release对象后,将对象置为nil(IBOutlet只需要将其置为nil,系统release view时已经将其release掉了) 一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行 viewDidUnload中被release的对象必须是很容易被重新创建的对象(比如在viewDidLoad或其他方法中创建的对象),不要release用户数据或其他很难被重新创建的对象 dealloc方法
当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning 从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。 这个函数的默认实现是:检查controller是否可以安全地释放它的view(这里加粗的view指的是controller的view属性),比如view本身没有superview并且可以被很容易地重建(从nib或者loadView函数)。 如果view可以被释放,那么这个函数释放view并调用viewDidUnload。 你可以重载这个函数来释放controller中使用的其他内存。但要记得调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。 如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在viewDidUnload中释放这些引用。
列举Cocoa中常见的集中多线程的实现,并谈谈多线程安全的几种解决办法,一般什么地方会用到多线程? NSOperation NSThread 怎么理解MVC,在Cocoa中MVC是怎么实现的? MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的协调者。 delegate和notification区别,分别在什么情况下使用? KVC(Key-Value-Coding) 当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id)valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。 (Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。) 设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。
id
id和void *并非完全一样。在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以你在使用id的时候不需要加星号。比如id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。
nil
nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。 内存管理 Autorelease、retain、copy、assign的set方法和含义? 1,你初始化(alloc/init)的对象,你需要释放(release)它。例如: NSMutableArray aArray = [[NSArray alloc] init]; 后,需要 [aArray release]; 2,你retain或copy的,你需要释放它。例如: [aArray retain] 后,需要 [aArray release]; 3,被传递(assign)的对象,你需要斟酌的retain和release。例如: obj2 = [[obj1 someMethod] autorelease]; 对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时: 你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉。但是在retain后,一定要在适当的时候进行释放。
关于索引计数(Reference Counting)的问题 retain值 = 索引计数(ReferenceCounting) NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会被执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(CollectionClasses)都执行类似操作。例如NSDictionary,甚至UINavigationController。 Alloc/init建立的对象,索引计数为1。无需将其再次retain。 [NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象,但是也是一个自动释放对象。所以是本地临时对象,那么无所谓了。如果是打算在全Class中使用的变量(iVar),则必须retain它。 缺省的类方法返回值都被执行了“自动释放”方法。(*如上中的NSArray) 在类中的卸载方法“dealloc”中,release所有未被平衡的NS对象。(*所有未被autorelease,而retain值为1的) 类别的作用? 有时我们需要在一个已经定义好的类中增加一些方法,而不想去重写该类。比如,当工程已经很大,代码量比较多,或者类中已经包住很多方法,已经有其他代码调用了该类创建对象并使用该类的方法时,可以使用类别对该类扩充新的方法。 注意:类别只能扩充方法,而不能扩充成员变量。 委托(举例) 委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。 frame 和 bounds 的区别 ,bound的大小改变frame 改变吗? frame:该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统) bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统) 1。简述push原理,push的证书和其它的右什么不一样?? 2。sqlite中插入特殊字符的方法和接收到处理方法。 3。谈谈你对数组和连表认识,还有你是怎么用他们的?? 4。冒泡算法。? 5。socket编程简述? 6。asihttp代码原理,异步请求的原理,异步请求最大数目,为什么只能这么多?? 异步请求最大数目,为什么只能这么多?? 这个数量是跟cpu有关的,并发性取决于cpu核数,每个核只能同时处理一个任务.4核cpu理论上可以并发处理4个任务,如果按http来算就是4个请求,但是cpu是抢占式资源,所以一般来说并发量是要根据任务的耗时和cpu的繁忙度来计算4个左右只是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不同的- -..一般来说估算这个量的最大效率估算公示是cpu核数*2-1,这个公式是当时对集群进行压测得到的结论.cpu抢占时间跟任务时长…开启这个数量的线程可以最大化的榨干cpu。一个道理。cpu不可能都被抢去做connection.iOS是cpu密集型的消耗?。这个大概知道就行了,也不会有人特别在意吧…cpu核数*2-1那个是做淘宝的java团队压测得到的线程最优数?,放在iOS上也多少适用…一般来说不超过这个量就好,线程不是起的越多越好,线程数就是…cpu来决定的 7。http请求方式? Get post put 还有是什么来着忘了? 8。uiview的圆角属性设置方法。?(m_mainImgView.layer.cornerRadius = 6;?m_mainImgView.layer.masksToBounds= YES;)? 9。masksToBounds属性的作用。(决定子layer是否被当前layer的边界剪切。默认是NO。) 8.iOS程序运行流程{ 1. 系统调用app的main函数 2. main函数调用UIApplicationMain. 3. UIApplicationMain创建sharedapplication instance, UIApplication默认的instance. 4. UIApplicationMain读取Info.plist找到主nib文件, 加载nib,把shared applicationinstance 设为nib的owner. 5. 通过nib文件,创建app的独立UIWindows object. 6. 通过nib,实例化了程序的AppDelegate object. 7. app内部启动结束,application:didFinishLaunchingWith-Options: 被设定成 wAppDelegate instance. 8. AppDelegate向UIWindowinstance发makeKeyAndVisible消息, app界面展示给用户. app准备好接收用户的操作指令. } 9. 内存管理的方式有哪些? 手动管理 ARC GC 10. 怎样实现一个singleton的类.给出思路 这个自己写一段单例的代码吧
11.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?. 12.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么? 13.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等. 14.ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗? 15.阐述一个nil对象从interfacebulider产生,到载入程序运行空间,最后被释放时所经历的生命周期. 16.notification是同步还是异步?kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢? 17.kvc是什么?kvo是什么?有什么特性? 18.响应者链是什么? 19.unix上进程怎么通信? 20.timer的间隔周期准吗?为什么?怎样实现一个精准的timer? 21.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗? 22.如果要开发一个类似eclipse的软件,支持插件结构。且开放给第三方开发。你会怎样去设计它?(大概思路) 23.C和obj-c 如何混用? 24.以下每行代码执行后,person对象的retaincount分别是多少?Person *person = [[Person alloc] init]; //count 1?[person retain]; // count 2?[person release]; //count 1?[person release]; //retain count = 1; 25ViewController 的didReceiveMemoryWarning 是在什么时候被调用的? 内存出现警告时。 26.ios5新特性有那些? 27.谈谈你对ARC 的认识和理解? 这个我说不好,怕说错了。在成了误导还是自己上网查吧。 28. View和CALayer的区别? 这个我也说不太好,不过在网上找到一个大牛写的不不错,看个去理解吧。我怕误导大家:http://www.cnblogs.com/lovecode/articles/2249548.html
|
|