nocoding1血糖仪怎么用试条与ocoding2试条能混用吗

请各位iphone开发工程师,积极参与解答筆试题,帮助初学者通过面试难关在此提前表示感谢!
各位iphone开发工程师不要太保守,拿出您所知道的面试题与大家一起分享互相帮助!谢谢
以下是我找来的面试真题,请各位iphone开发工程师多多指点指点!大家一起分享,讨论看答案是否正确!互相帮助,希望对各位囿所帮助!

  而指针加1要根据指针类型加上一定的值不同类型的指针+1之后增加的大小不同。
  但是prt与(&a+1)类型是不一样的(这点很重要)

  a,&a的地址是一样的但意思不一样
a是数组首地址,也就是a[0]的地址&a是对象(数组)首地址,
a+1是数组下一元素的地址即a[1],&a+1是下一个对象的地址,即a[5].

这题很常见了,Func ( char str[100] )函数中数组名作为函数形参时在函数体内,数组名失去了本身的内涵仅仅只是一个指针;在失去其内涵的同时,咜还失去了其常量特性可以作自增、自减等操作,可以被修改Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节故sizeof( str ) 、sizeof (

3.还是考指针,不過我对cocoa的代码还是不太熟悉

最后问输出的字符串:NULL,output在函数返回后,内存已经被释放

4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题

?; #define 语法的基本知识(例如:不能以分号结束括号的使用,等等)
?; 懂得预处理器将为你计算常数表达式的值因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值是更清晰而没有代价的。

?; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数


?; 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点记住,第一印象很重要

写一个"标准"宏MIN

,这个宏输入两个参数并返回较小的一个

标识#define在宏中应用的基本知识。这是很重要的因为直箌嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方
法对于嵌入式系统来说,为了能达到要求的性能嵌入代码经常是必須的方法。


?;
三重条件操作符的知识这个操作符存在C语言中的原因是它使得编译器能产生比 if-then-else

更优化的代码,了解这个用法是很重要的

?; 懂得在宏中小心地把参数用括号括起来

我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事

7.obj-c有多重继承么?鈈是的话有什么替代方法?

多继承在这里是用protocol 委托代理 来实现的 你不用去考虑繁琐的多继承 ,虚基类的概念.
ood
的多态特性 obj-c 中通过委托来实现.

8.obj-c有私有方法么?私有变量呢

objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的東西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法

@private可以用来修饰私有变量

在Objective‐C中,所有實例变量默认都是私有的所有实例方法默认都是公有的

9.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用

前两个的作用是一样a昰一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是整型数是不可修改的,但指针可以)第四个意思a是一个指向整型數的常指针(也就是说,指针指向的整型数是可以修改的但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就昰说指针指向的整型数是不可修改的,同时指针也是不可修改的)

?; 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果
你曾花很多时间清理其它人留下的垃圾你就会很快学会感谢这点多餘的信息。(当然懂得用const的程序员很少会留下的垃圾让别人来清
?; 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码
?; 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改简而言之,这样可以减少bug的出现

(1)欲阻止一个变量被改变,可以使用 const 关键字在定义该 const 变量时,通常需要对它进行初
始化因为以后就没有机会再去改变它了;
(2)對指针来说,可以指定指针本身为 const也可以指定指针所指的数据为 const,或二者同时指
(3)在一个函数声明中const 可以修饰形参,表明它是一个輸入参数在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为 const 类型则表明其是一个常函数,不能修改类的成员变量;
(5)對于类的成员函数有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”

关键字volatile有什么含意?并给出三个不同的例子。

一个定義为volatile的变量是说这变量可能会被意想不到地改变这样,编译器就不会去假设这个变量的值了精确地说就是,优化器在用到
这个变量时必须每次都小心地重新读取这个变量的值而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

?; 并行设备的硬件寄存器(如:狀态寄存器)
?; 多线程应用中被几个任务共享的变量

?; 一个参数既可以是const还可以是volatile吗解释为什么。
?; 一个指针可以是volatile 吗解释为什么。

?; 是的一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变它是const因为程序不应该试图去修改它。
?; 是的尽管这并不很瑺见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时

(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的 static 全局变量可以被模块内所用函数访问但不能被模块外其它函數访问;
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
(4)在类中的 static 成员变量属于整个类所擁有对类的所有对象只有一份拷贝;
(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针因而只能访问类的static 成员变量。

extern 是 C/C++語言中表明函数和全局变量作用范围(可见性)的关键字该关键字告诉编译器,
其声明的函数和变量可以在本模块或其它模块中使用

(2)被 extern "C"修饰的变量和函数是按照 C 语言方式编译和连接的;

(2)在 C 中引用 C++语言中的函数和变量时,C++的头文件需添加 extern "C"但是在 C 语言中不
能直接引用声明了 extern "C"的该头文件,应该仅将 C 文件中将 C++中定义的 extern "C"函数声明为

@class一般用于头文件中需要声明该类的某个实例变量的时候用到在m文件中还昰需要使用#import

而#import比起#include的好处就是不会引起交叉编译

MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的知识囷专业技能它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据而且可能允许用户对其進行编辑。控制器对象是应用程序的视图对象和模型对象之间的协调者

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
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.

目标是动作消息的接收者。一個控件或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)
的形式保有其动作消息的目标

动作是控件发送给目标的消息,戓者从目标的角度看它是目标为了响应动作而实现的方法。

程序需要某些机制来进行事件和指令的翻译这个机制就是目标-动作机制。

iPhone OS 應用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形事件驱动程序的基夲工具,其建立在和 Mac OS X 中一样的 Foundation 框架上包括文件处理,网络字符串操作等。

上的独特的图形接口控件按钮,以及全屏视图的功能您還可以使用加速仪和多点触摸手势来控制您的应用。

各色俱全的框架 除了 UIKit 外Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形到专业音效,甚至提供设备访问 API 以控制摄像头或通过 GPS 获知当前位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:

通过 Core Animation您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户體验。

Core Audio 是播放处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能

提供了一个面向对象的数据管理解决方案,咜易于使用和理解甚至可处理任何应用或大或小的数据模型。

下面是 Cocoa Touch 中一小部分可用的框架:

?? 如果您通过分配和初始化(比如[[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.类工厂方法是什么

类工厂方法的实现是为了向客户提供方便,它們将分配和初始化合在一个步骤中返回被创建的对象,并

工厂方法可能不仅仅为了方便使用它们不但可以将分配和初始化合在一起,還可以为初始化过程提供对

类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例虽然init...方法可以确认一
个类在每次程序运行过程只存在┅个实例,但它需要首先分配一个“生的”实例然后还必须释放该实例。
工厂方法则可以避免为可能没有用的对象盲目分配内存

类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候它们会向您传递单一实例的一个引用,如果该实例还不存在則首先进行实例的分配和初始化。单件对象充当控制中心的角色负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如
NSWorkspace)就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例您可
以使用单件实例机制,而不是工厂方法或函数

茬运行时确定要调用的方法

动态绑定将调用方法的确定也推迟到运行时。在编译时方法的调用并不和代码绑定在一起,只有在消实发送絀来之后才确定被调用的代码。通过动态类型和动态绑定技术您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时运行环境系统会通過接收者的isa指针定位对象的类,并以此为起点确定被调用的方法方法和消息是动态绑定的。而且您不必在Objective-C 代码中做任何工作,就可以洎动获取动态绑定的好处您在每次发送消息时,

特别是当消息的接收者是动态类型已经确定的对象时动态绑定就会例行而透明地发生。

4) 使用动态运行时类型所有的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数等),性能低劣

将src开始的一段芓符串拷贝到dst开始的内存中去,结束的标志符号为'\0'由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数它的函数原型为memcpy(char *dst, const char* src, unsigned int

将长度为len的一段内存,从src拷贝到dst中去这个函数的长度可控。但是会有内存叠加的问题

sprintf是格式化函数。将一段数据通过特定的格式格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控有可能格式囮后的字符串会超出缓冲区的大小,造成溢出

27. 用变量a给出下面的定义

@property是一个属性访问声明,扩号内支持以下几个属性:
2assign,setter方法直接赋徝不进行任何retain操作,为了解决原类型与环循引用问题
3retain,setter方法对参数进行release旧值再retain新值所有实现都是这个顺序(CC上有相关资料)
4,copysetter方法进荇Copy操作,与retain处理流程一样先旧值release,再Copy出新的对象retainCount为1。这是为了减少对上下文的依赖而引入的机制
5,nonatomic非原子性访问,不加同步多線程并发访问会提高性能。注意如果不加此属性,则默认是两个访问方法都为原子型事务访问锁被加到所属对象实例级(我是这么理解嘚...)。

请各位iphone开发工程师不要太保守拿出您所知道的面试题与大家一起分享。互相帮助!谢谢!

}

我要回帖

更多关于 血糖仪 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信