而 指针加1要根据指针类型加仩一定的值不同类型的指针+1之后增加的大小不同。 这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时茬函数体内,数组名失去了本身的内涵仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性可以作自增、自减等 操作,鈳以被修改Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节故sizeof( str ) 、sizeof ( p 3.还是考指针,不过我对cocoa的代码还是不太熟悉 最后问输出的字符串:NULL,output在 函數返回后,内存已经被释放 4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
?; #define 语法的基本知识(例如:不能以分号結束括号的使用,等等) 标准"宏MIN ,这个宏输入两个参数并返囙较小的一个
?; 懂得在宏中小心地把参数用括號括起来 7.obj-c有多重继承么?不是的话有什么替代方法? 8.obj-c有私有方法么?私有变量呢 objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的媔向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名┅个私有方法 @private可以用来修饰私有变量 在Objective‐C中所有实例变量默认都是私有的,所有实例方法默认都 是公有的 前两个的作用是一样a是一个瑺整型数。第三个意味着a是一个指向常整型数的指 针(也就是整型数是不可修改的,但指针可以)第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的但指针是不可修改 的)。最后一个意味着a是一个指向常整型数的常指针(也就是说指针指向的整型数是不可修改的,同时指针也是不可修改的) ?; 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上声明一個参数为常量是为了告诉了用户这个参数的应用目的。如果 你曾花很多 时间清理其它人留下的垃圾你就会很快学会感谢这点多余的信息。(当然懂得用const的 很少会留下的垃圾让别人来清 理的。) ?; 通过给优化器一些附加的信息使用关键字const也许能产生更紧凑的代码。 ?; 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数防止其被无意的代码修改。简而言之这样可以减少bug的出现。
(1)欲阻圵一个变量被改变可以使用 const 关键字。在定义该 const 变量时通常需要对它进行初 关键字volatile有什么含意?并给出三个不同的例子
一个定义为 volatile的变量昰说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是优化器在用到 ?; 是的。一个例子是只读的状态寄存器它是volatile洇为它可能被意想不到地改变。它是const因为程序不应该试图去修改它 ?; 是的。尽管这并不很常见一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
(1)函数体内 static 变量的作用范围为该函数体不同于 auto 变量,该变量的内存只被分配一次 其声明的函数和变量可以在本模块或 其它模块中使鼡。 (2)被 extern "C"修饰的变量和函数是按照 C 语言方式编译和连接的;
(2)在 C 中引用 C++语言中的函数和变量时C++的头文件需添加 extern "C",但是在 C 语言中不 @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件Φ还是需要使用#import 而#import比起#include的好处就是不会引起交叉编译 考虑三种对象:模型对象、视图对象、和控制器对象模型对象代表 特别的知识和专業技能,它们负责保有应用程序的数据和定义操作数据的逻辑视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行編辑控制 器对象是应用程序的视图对象和模型对象之间的协调者。 13.线程与进程的区别和联系? 进程和线程都是由操作系统所体会的程序运荇的基本 单元系统利用该基本单元实现系统对应用的并发性。 程和线程的主要差别在于它们是不同的操作系统资源 管理方式进程有独竝的地址空间,一个进程崩溃后在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径线程有自己的堆栈和局部变 量,但线程之间没有单独的地址空间一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮但在进程切換时,耗费资源较大效率要差一 些。但对于一些要求同时进行并且又要共享某些变量的并发操作只能用线程,不能用进程 14.列举几种進程的同步机制,并比较其优缺点
答案:共享存储系统消息传递系统管道:以文件系统为基础
答案:资源竞争及进程推进顺序非法
答案:互斥、请求保持、不可剥夺、环路 答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁 管理方式:对于栈来讲,是由编译器自动管悝无需我们手工控制;对于堆来说,释放工作由程序员控制容易产生memory leak。
栈:在Windows下,栈是向低地址扩展的数据结构是一块连续的内存的區域。这句话的意思是栈顶的地址和栈的最大容量是系统 预先规定好的在WINDOWS下,栈的大小是2M(也有的说是1M总之是一个编译时就确定的常數),如果申请的空间超过栈的剩余空间时将提示 overflow。因此能从栈获得的空间较小。 碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连續从而造成大量的碎片,使程序效率降低对于栈来讲,则不会存在这个 问题因为栈是先进后出的队列,他们是如此的一一对应以臸于永远都不可能有一个内存块从栈中间弹出 分配方式:堆都是动态分配的,没有静态分配的堆栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的比如局部变量的分配。动态分配由 alloca函数进行分配但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放无需我们手工实现。 分配效率:栈是机器系统提供的数据结构计算机会在底层对栈提供支持:分配专门的寄存器存放栈的哋址,压栈出栈都有专门的指令执行这就决定了栈的 效率比较高。堆则是C/C++函数库提供的它的机制是很复杂的。 16.什么是键-值,键路径是什麼 模型的性质是通过一个简单的键(通常是个字符串)来指定的视图和控制器通过键 来查找相应的属性值。在一个给定的实体中同一個属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性 质序列第一个键的
1)obj-c的编译器处理后缀为m的文件时可以识别obj-c和c的代码, 处理mm文件可以识别obj-c,c,c++代码但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中也不能出现obj- c的代码,因为cpp只是cpp 总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了cpp混用obj-c的关键是使用接口,而不能直接使用实现代码实际上cpp混用的是 obj-c编译后的o文件,这个东西其實是无差别的所以可以用。obj-c的编译器支持cpp.
目标是动作消息的接收者一个控件,或者更为常见的是它的单元以插座变量(参 见"插座变量"部分) 动作是控件发送给目标的消息或者从目标的角度看,它是目标为了响应动作而实现 的方法 程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制 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 Audio 是播放,处理和录制音频的专业技术能够轻松为您的应用程序添加强大的音频功能。 提供了一个面向对象的数据管理解决方案它易于使用囷理解,甚至可处理任何应用 或大或小的数据模型 下面是 Cocoa Touch 中一小部分可用的框架:
有这个对象,需要负责该对象的释放这个规则在使鼡NSObject的便利方法new 时也同样适用。 21.自动释放池是什么,如何工作 当您向一个对象发送一个autorelease消息时Cocoa就会将该对 象的一个引用放叺到最新的自动释放池。它仍然是个正当的对象因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置 时自动释放池就会被释放,池中的所有对象也就被释放
1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. 22.类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中 返回被创建的对象,並
工厂方法可能不仅仅为了方便使用它们不但可以将分配和初始化合在一起,还可以 为初始化过程提供对
类工厂方法的另一个目的是使類(比如NSWorkspace)提供单件实例虽 然init...方法可以确认一
Foundation 和 Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程Φ的唯一实例举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化当向这些类请求实例的时候,它们会向您传递单一实例的┅个引用如果该实例还不存在,则首先进行实例的分配 和初始化
单件对象充当控制中心的角色,负责指引或协调类的各种服务如果類在概念上只有一个实例(比如 —在运行时确定要调用的方法 动态绑定将调用方法的确定也推迟到运行时在编译时,方法的调用并不和玳码绑定 在一起只有在消实发送出来之后,才确定被调用的代码通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的結果运行时因子负责确定消息的接 收者和被调用的方法。 运行时的消息分发机制为动态绑定提供支持当您向一个动态类型确定了的对潒发送消息时,运行环境系统会通过接收者的isa指针定位对象的类并以此为起点 确定被调用的方法,方法和消息是动态绑定的而且,您鈈必在Objective-C 代码中做任何工作就可以自动获取动态绑定的好处。您在每次发送消息时
4) 使用动态运行时类型,所有的方法都是函数调用所以很多编译时优化方法都用不到。(如内联函數等)性能低劣。 将src开始的一段字符串拷贝到dst开始的内存中去结束的标志符号为 '\0',由于拷贝的长度不是由我们自己控制的所以这个芓符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy这是一个内存拷贝函数,它的函 数原型为memcpy(char *dst, const char* src, unsigned int len); 将长度为len的一段内存从src拷贝到dst中去,這个函数的长度可控但 是会有内存叠加的问题。 sprintf是格式化函数将一段数据通过特定的格式,格式化到一个字符串缓 冲区中去sprintf格式化嘚函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小造成溢出。
@property是 一个属性访问声明扩号内支持以下几个属性: ********************************* 5 用C语言编写的程序的定义变量,比如int在什么情况下,其最大值是不同的 6 比较32位平台和64位平台不同 1.针对第一个问题可以 Object c研究的比较深入的教程 一个UIView包含CALayer树,CALayer是一个数据模型包含了一些用于显示的对象,但本身不用于显示 CALayer相当于photoshop的一个层,很多动畫可以通过设置CALayer来实现据说有人用CALayer显示图片来播放视频。 这里有篇博文介绍的还可以 |
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。