知识点(3)"/>
iOS知识点(3)
- 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?并区别strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain?
管理机制:使用了一种叫做引用计数的机制来管理内存中的对象。OC中每个对象都对应着他们自己的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加1。相反,当你像一个对象发送release消息时,持有计数数值会减小1。当对象的持有计数变为0的时候,对象会释放自己所占用的内存。
retain(引用计数加1)->release(引用计数减1)
alloc(申请内存空间)->dealloc(释放内存空间)
readwrite: 表示既有getter,也有setter (默认)
readonly: 表示只有getter,没有setter
nonatomic:不考虑线程安全
atomic:线程操作安全 (默认)
线程安全情况下的setter和getter:
- (NSString*) value {
@synchronized(self) {
return [[_value retain] autorelease];
}}
- (void) setValue:(NSString*)aValue {
@synchronized(self) {
[aValue retain];
[_value release];
_value = aValue;
} }
retain: release旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
assign: 简单赋值,不更改索引计数 (默认)
copy: 其实是建立了一个相同的对象,地址不同(retain:指针拷贝 copy:内容拷贝)
strong:(ARC下的)和(MRC)retain一样 (默认)
weak:(ARC下的)和(MRC)assign一样, weak当指向的内存释放掉后自动nil化,防止野指针
unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。
- 类变量的@protected ,@private,@public,@package,声明各有什么含义?
@private:作用范围只能在自身类
@protected:作用范围在自身类和继承自己的子类 (默认)
@public:作用范围最大,可以在任何地方被访问。
@package:这个类型最常用于框架类的实例变量,同一包内能用,跨包就不能访问
- 线程是什么?进程是什么?二者有什么区别和联系?
一个程序至少有一个进程,一个进程至少有一个线程:
进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存
线程:线程是指进程内的一个执行单元。
联系:线程是进程的基本组成单位
区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
举例说明:操作系统有多个软件在运行(QQ、office、音乐等),这些都是一个个进程,而每个进程里又有好多线程(比如QQ,你可以同时聊天,发送文件等)
- 谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
好处:
1.使用线程可以把占据时间长的程序中的任务放到后台去处理
2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
3.程序的运行效率可能提高
4·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。
缺点:
1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
2.更多的线程需要更多的内存空间。
3.线程的中止需要考虑其对程序运行的影响。
4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
实现多线程的方法:
- NSObject类方法
- NSThread
- NSOperation
- GCD
- 多线程同步和异步的区别?IOS中如何实现多线程的同步?
异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐
同步:是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,上厕所
关键字@synchronized()
NSOperationQueue:maxcurrentcount
NSConditionLock
GCD->
- 简述什么地方会用到多线程?谈谈多线程安全问题的几种解决方案?何为线程同步,如何实现的?分线程回调主线程方法是什么,有什么作用?
- 假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理之后的输出结果为:aabcd
- 获取一台设备唯一标识的方法有哪些?
.html
- ios类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。 OC没有多继承,协议能够实现多继承。
protocol
- 堆和栈的区别?
问题扩展:要知道OC中NSString的内存存储方式
- ios本地数据存储都有哪几种方式?
- NSKeyedArchiver
- NSUserDefaults
- Write写入方式
- SQLite3
(问题扩展:什么情况下使用什么样的数据存储)
- 写出方法获取ios内存使用情况。
.html
(问题扩展:如何利用Xcode观察内存使用情况)
- 深拷贝和浅拷贝的理解?
.html
.html
- 怎样实现一个singleton的类。
问题扩展:单例的好处是什么?
- 什么是安全释放?
置nil
- RunLoop是什么?
- 什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
- 写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
#define MIN(X,Y) ((X)>(Y)?(Y):(X)) 为什么加小括号。直接替换
如果不加小括号 min(4+5, 1+10) 4+5>1+10 ? 4+10 : 1+5
扩展:在定义宏的时候需要注意哪些问题?
- 垃圾回收机制是什么iphone os有没有垃圾回收机制?简单阐述一下OC内存管理。 本身有,在ios平台上用引用计数代替
- 简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
自己可以写个demo来测试一下
- ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
.html
自己写代码测试加深理解
- 描述应用程序的启动顺序。
1. 程序入口main函数创建UIApplication实例和UIApplication代理实例。
2. 在UIApplication代理实例中重写启动方法,设置第一ViewController。
3. 在第一ViewController中添加控件,实现应用程序界面。
- 为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
防止循环引用
Student * str=[];
Teacher *teacher=[[Teacher alloc] init];
Student * student=[[Student alloc] init];
teacher.delegate=student;
student.delegate= teacher;
在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。
UITableVIewController:
Self.tableview.delegate=self.VC;
ViewController:<UItableviewdelegate>
Self.tableview.delegate=self.tableviewcontroller;
- 使用UITableView时候必须要实现的几种方法?
-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section;这个方法返回每个分段的行数,不同分段返回不同的行数可以用switch来做,如果是单个列表就直接返回单个你想要的函数即可。-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath)indexPath;这个方法是返回我们调用的每一个单元格。通过我们索引的路径的section和row来确定
- 写一个便利构造器。
//id代表任意类型指针,这里代表Student *,类方法
+(id)studentWithName:(NSString *)newName andAge:(int)newAge
{
Student *stu=[[Student alloc]initName:newName andAge:newAge];
return [stu autorelease];//自动释放
}
- UIImage初始化一张图片有几种方法?简述各自的优缺点。
.html
面试题比较齐全的网址:
- 回答person的retainCount值,并解释为什么
Person * per = [[Person alloc] init];
self.person = per;
2
- 这段代码有什么问题吗:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
死循环(扩展:知道如何正确写setter和getter方法)
- 这段代码有什么问题,如何修改
for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;//常量区
string = [string lowercaseString];//新的堆区
string = [string stringByAppendingString:@"xyz"];//新的堆区
NSLog(@“%@”, string);
}
在for循环里添加自动释放池(扩展:常量区的retaincount是怎么个情况)
- 截取字符串”20 | ”中,”|”字符前面和后面的数据,分别输出它们。
NSString * str1=[NSString stringWithFormat:@"%@",@"hello|world"];
NSArray * array=[str1 componentsSeparatedByString:@"|"];
for (NSString * temp in array) {
NSLog(@"---->%@",temp);
}
componentsSeparatedByCharactersInSet componentsSeparatedByString ?
- 用obj-c写一个冒泡排序
//升序排列
- (NSArray *)mySort:(NSArray *)oldArray
{
NSMutableArray * newArray=[NSMutableArray arrayWithArray:oldArray];
NSInteger num=[oldArray count];
for(int i = 0 ; i < num ; i++)
{
for(int j=0; j<num-1-i; j++)
{
int num1 = [[newArray objectAtIndex: j] intValue];
int num2 = [[newArray objectAtIndex: j+1] intValue];
if(num1 < num2)
{
[newArray replaceObjectAtIndex: j withObject:[NSString stringWithFormat:@"%d",num2]];
[newArray replaceObjectAtIndex: j+1 withObject:[NSString stringWithFormat:@"%d",num1]];
}
}
}
return newArray;
}
- 简述你对UIView、UIWindow和CALayer的理解
- 写一个完整的代理,包括声明,实现
@protocol TeacherAndStudentProtocol <NSObject>
@required
- (void) doHomeWork;
- (void) goToClass;
@optional
- (void) ask;
@end
//创建一个老师类
#import <Foundation/Foundation.h>
#import "TeacherAndStudentProtocol.h"
@interface Teacher : NSObject
//声明一个协议delegate,在其中有三个方法,即三个委托项。当老师要让学生做什么时,只需要通过delegate 调用 对应的方法即可. [teacher.delegate doHomeWork];
@property (nonatomic,assign)id<TeacherAndStudentProtocol> delegate;
@end
//创建一个学生类 并实现三个具体的方法
#import <Foundation/Foundation.h>
#import "Teacher.h"
@interface Student : NSObject<TeacherAndStudentProtocol>
@end
- 分析json、xml的区别?json、xml解析方式的底层是如何处理的?
底层实现:
json解析的用法,用框架的用法简单介绍:
底层原理遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号, : 号 等进行区分, {}号是一个字典的开始,[]号是一个数组的开始, : 号是字典的键和值的分水岭,最终乃是将json数据转化为字典,
字典中值可能是字典,数组,或字符串而已。
NSXMLParser, 其他解析方式有自定义二进制解析,就是按字节去解析,电话会谈就是如此,
还可以是字符串之间用特殊符号连接的数据,将此数据用特殊符号可以分割成所用数据。
- ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么? 根视图置空
.html
- 面向对象的三大特征,并作简单的介绍
封装、继承、多态
多态:父类指针指向子类对象。两种表现形式:重写(父子类之间)和重载(本类中)
OC的多态体现是:重写,没有重载这种表现形式
举例说明:
@interface Parent : NSObject //父类
- (void)simpleCall;
@end
@interface Child_A : Parent //子类 Child_A
@end
@implementation Child_A
- (void)simpleCall
{
NSLog(@"我是Child_A的simpleCall方法");
}
@end
@interface Child_B : Parent //子类Child_B
@end
- (void)simpleCall
{
NSLog(@"我是Child_的simpleCall方法");
}
@end
然后,我们就可以看到多态所展示的特性了:
Parent * pa=[[Child_A alloc] init];// 父类指针指向子类Child_A对象
Parent * pb=[[Child_B alloc] init]; //父类指针指向子类Child_B对象
[pa simpleCall];// 显然是调用Child_A的方法
[pb simpleCall];// 显然是调用Child_B的方法
在OC中常看见的多态体现:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellWithIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];
return cell;
}
(UITableViewCell *)指向cell子类对象
- 重写一个NSStrng类型的,retain方式声明name属性的setter和getter方法
- 简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?
.html
Notification:观察者模式,controller向defaultNotificationCenter添加自己的 notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给 观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也 可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload 跟dealloc中都要注销)。
- What is lazy loading?
懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。一个延时载,避免内存过高,一个异步加载,避免线程堵塞
- 什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为什么?
委托的property声明用什么属性是assign(防止循环引用)
- 分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
考虑类目比继承的优点
- Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?
- #import、#include和@class有什么区别
- 谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?
- 如监测系统键盘的弹出
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];
扩展:ios 弹出键盘挡住UITextView的解决方式
- 举出5个以上你所熟悉的ios sdk库有哪些和第三方库有哪些?
- 如何将产品进行多语言发布?
/
- 如何将敏感字变成**
- objc中的减号与加号代表什么?
- 单例目的是什么,并写出一个?
- 说说响应链
- 我们说的OC是动态运行时语言是什么意思?什么是动态识别,动态绑定?
动态:
主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。 简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
现在,让我来想想OC的动态语言特性。OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。
(1)动态类型
动态类型,说简单点就是id类型。动态类型是跟静态类型相对的。像内置的明确的基本类型都属于静态类型(int、NSString等)。静态类型在 编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。
id obj = someInstance;
if ([obj isKindOfClass:someClass]) {
someClass *classSpecifiedInstance = (someClass *)obj;
}
(2)动态绑定
动态绑定(dynamic binding)貌似比较难记忆,但事实上很简单,只需记住关键词@selector/SEL即可。先来看看“函数”,对于其他一些静态语言,比如 c++,一般在编译的时候就已经将将要调用的函数的函数签名都告诉编译器了。静态的,不能改变。而在OC中,其实是没有函数的概念的,我们叫“消息机 制”,所谓的函数调用就是给对象发送一条消息。这时,动态绑定的特性就来了。OC可以先跳过编译,到运行的时候才动态地添加函数调用,在运行时才决定要调 用什么方法,需要传什么参数进去。这就是动态绑定,要实现他就必须用SEL变量绑定一个方法。最终形成的这个SEL变量就代表一个方法的引用。这里要注意 一点:SEL并不是C里面的函数指针,虽然很像,但真心不是函数指针。SEL变量只是一个整数,他是该方法的ID,@selector()就是取类方法的编号。以前的函数调用,是根据函数名,也就是 字符串去查找函数体。但现在,我们是根据一个ID整数来查找方法,整数的查找字自然要比字符串的查找快得多!所以,动态绑定的特定不仅方便,而且效率更 高。
由于OC的动态特性,在OC中其实很少提及“函数”的概念,传统的函数一般在编译时就已经把参数信息和函数实现打包到编译后的源码中了,而在OC中最常使 用的是消息机制。调用一个实例的方法,所做的是向该实例的指针发送消息,实例在收到消息后,从自身的实现中寻找响应这条消息的方法
(3)动态加载
根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x的图片,而在老一些的普通屏设备上加载原图。
- 分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并说明autorelease是什么时候被release的?简述什么时候由你负责释放对象,什么时候不由你释放?[NSAutoreleasePool release] 和[NSAutoreleasePool drain]有什么区别
联系:pool向所有在pool中的对象发出一个release的消息
区别:在GC状态下,NSAutoreleasePool release空指令,而drain发送release消息
- 说说下面关键词在内存管理的作用:alloc、init、copy、retain、release、autorelease、dealloc、retaincount?
- drawRect和layoutSubviews的区别
- http和socket通信的区别?socket连接相关库,TCP,UDP的区别?http的几种常用方式?
.html
.html
- 什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是 相对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象 的特定属性.(考虑kvc)
- 声明一个静态方法和一个实例方法?
.html
- 什么是push?远程推送?
.html
- init和initwithobject区别(语法)?
- 请写出代码,用blocks来取代上例中的protocol,并比较两种方法的优势。实际应用部分?请写出代码,用blocks取代协议或回调方法
熟悉block和delegate
- 你做iphone开发时候,有哪些传值方式,view和view之间是如何传值的?
- 给定的一个字符串,判断字符串中是否还有png,有就删除它?
- 对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象?
声明 NSString *testObject 是告诉编译器,testObject是一个指向某个Objective-C对象的指针。因为不管指向的是什么类型的对象,一个指针所占的内存空间都是固定的,所以这里声明成任何类型的对象,最终生成的可执行代码都是没有区别的。这里限定了NSString只不过是告诉编译器,请把testObject当做一个NSString来检查,如果后面调用了非NSString的方法,会产生警告。
接着,你创建了一个NSData对象,然后把这个对象所在的内存地址保存在testObject里。那么运行时,testObject指向的内存空间就是一个NSData对象。你可以把testObject当做一个NSData对象来用。
- OC中是所有对象间的交互是如何实现的?
在Objective-C中所有对象间的交互都是通过指针实现的,确切的说话,叫做发送消息。
- 目标-动作机制
.html
用户轻敲 Hello 按钮时,你要让按钮给视图控制器(即目标)发送一个“更改欢迎辞”的消息(即动作)
- for(int index = 0; index < largenumber; index ++){
NSString *tempStr = @”tempStr”;
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];(注意这行)
NSLog(tempNumber);
}这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么? - 描述上拉加载、下拉刷新的实现机制?
- 什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?
- 介绍一下XMPP?有什么优缺点吗?
- 谈谈对性能优化的看法,如何做?
从用户体验出发:1、程序loading不要太长、2、相同数据不做重复获取、3、昂贵资源要重用(cell、sqlite、date),4、良好的编程习惯和程序设计:选择正确的集合对象和算法来进行编程、选择适合的数据存储格式(plist、SQLite)、优化SQLite查询语句5、数据资源方面的优化(缓存和异步加载)
解决方案:
- 能够发现问题
- 利用log或工具分析问题原因
- 假设问题原因
- 改进代码和设计
- 应用程序如何省电?
网络设备是相当耗电的、GPS设备
耗电量,其实也是性能问题.程序优化么,就是要找到程序的瓶颈,然后才能优化.程序运行的慢.
- 写一个递归方法:计算N的阶乘,然后将计算结果进行存储。以便应用退出后下次启动课直接获取该值。
- NSArray和NSMutableArray的区别,多线程操作哪个更安全?
- 当前有一个数组,里面有若干重复的数据,如何去除重复的数据?(会几个写几个)
- isKindOfClass、isMemberOfClass作用分别是什么?
使用isKindOfClass来确定一个对象是否是一个类的实例,或者是该类祖先类的实例。isMemberOfClass只能用来判断前者,不能用来判断后者
isMemberOfClass不能检测任何的类都是基于NSObject类这一事实,而isKindOfClass可以
Person Teacher NSObject
ï if ([teacher isMemberOfClass:[Teacher class]]) //YES
ï if ([teacher isMemberOfClass:[Person class]]) //NO
ï if ([teacher isMemberOfClass:[NSObject class]]) //NO
ï if ([teacher isKindOfClass:[Teacher class]]) //YES ï
ï if ([teacher isKindOfClass:[Person class]]) //YES ï
ï if ([teacher isKindOfClass:[NSObject class]]) //YES .html
- 写出下面程序段的输出结果
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"];
NSLog(@"%@", [dict objectForKey:@"akey"]);
[dict release];
- 请写出以下代码的执行结果
NSString * name = [ [ NSString alloc] init ];
name = @”Habb”;
[ name release];
- 请分别写出SEL、id的意思?
id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;
- iPhone上,不能被应用程序直接调用的系统程序是什么?
时钟、视频、指南针、天气、计算器、备忘录、提醒事件、股市
.html
- 以.mm为拓展名的文件里,可以包含的代码有哪些?c和obj-c如何混用?
如何在Objective-C中使用C++类并成功编译?
.h :头文件。头文件包含类,类型,函数和常数的声明。
.m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。
.mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名
.html
- 说说如何进行后台运行程序?
1、检查设备是否支持多任务
2、applicationDidEnterBackground和applicationWillEnterForeground(UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification)
3、声明你需要的后台任务(在Info.plist中添加UIBackgroundModes键值:audio、location、voip)
.shtml
- sizeof和strlen的区别和联系
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
- sprintf,strcpy,memcpy的功能?使用上要有哪些要注意的地方
char*strcpy(char *dest, const char *src);
其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作会出现段错误。
int sprintf(char*str, const char *format, ...)
函数操作的源对象不限于字符串:源对象可以是字符串、也可以是任意基本类型的数据。主要是实现将其他数据类型转换为字符串
void *memcpy(void*dest, const void *src, size_t n)
实现内存的拷贝,实现将一块内存拷贝到另一块内存。该函数对源对象与目的对象没有类型现在,只是对内存的拷贝
- 自己写函数,实现strlen功能
注意“\0”
- 写一个代码片段输入一个字符串“20130322152832”,输出一个NSDate类型的对象,打印该对象输出2013-03-22 15:28:32
- 找错误
a:void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );//注意strcpy特点
}
b:void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );//内存释放问题
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
- 用变量a写出以下定义
a、一个整型数 int a
b、一个指向整型数的指针 int * a
c、一个指向指针的指针,它指向的指针是指向一个整型数int **a3;
d、一个有10个整型数的数组 int a4[10];
e、一个有10个指针的数组,该指针是指向一个整型数的 int *a5[10];
f、一个指向有10个整型数数组的指针int (*a6)[10];
g、一个指向函数的指针,该函数有一个整型参数,并返回一个整型数int (*a7)(int);
.php?mod=viewthread&tid=683333&page=2
- 编写函数_memmove说明如下:实现C语言库函数memmove的功能:将一块缓冲区中的数据移动到另一块缓冲区中。可能有重复。
- 什么叫数据结构?
- 什么是抽象类?抽象类有什么作用?能实例化吗? OC中没有抽象类,协议可以起到抽象类的作用
- 考察对@interface和@property的理解?
- Iphone开发中控制类有什么作用?逻辑运算,将数据提供给视图,检测屏幕旋转,收到内存警告
- 线程中有哪些函数?写出来。
- 有没有写过自定义的控件?
- 调用一个类的静态方法需不需要release?
- do-while 与 while-do的区别?
- 写出几个死循环?
- main.m中都发生了什么?
答:程序入口,创建 自动释放池,创建应用程序对象,并启动其主循环,运行程序,释放程序运行期间得所有加入自动释放池的对象。
- int retVal = UIApplicationMain(argc, argv, nil, nil); 是什么意思?
对UIApplication对象进行了初始化,这个方法除了argc 和 argv 参数外,另外这个函数还有2个两个字符串参数来识别UIApplication类和UIApplication代理类,在这里默认是2个nil,第一个参 数为nil就默认把UIApplication类作为缺省值进行初始化,可以在这里不填nil而是使用自己定义的UIApplication子类。至于第 二个参数nil就设置为nil就把模板生成的HelloWorldAppdelegate类作为默认值。
- 编写NSArray的setter和getter?
getter比较容易,直接返回NSArray的指针就可以了,
setter注意每个元素加进去得时候需要retain一次。
- 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
- 你了解svn,cvs等版本控制工具么?
- 简述值传递和引用传递的区别?
- Cocoa中有虚基类的概念么?怎么简洁的实现?
- 关于Objective-C++中的异常处理,可以相互捕获到吗?
- OC中异常exception 怎么捕获?不同的CPU结构上开销怎样?C中又什么类似的方法?
- obc中可修改和不可以修改类型
- 浅复制和深复制的区别?
- 获取项目根路径,并在其下创建一个名称为userData的目录?
- objective-c中的类型转换分为哪几类?
- xml解析的原理是什么,你还用过其他解析方式么?
- iphone阅读器,如果要读取一个文本文件,请问你是如何处理编码问题的?另外像pdf格式的文件,你如何读取。?
- 你在开发大型项目的时候,如何进行内存泄露检测的? 内存泄露怎么处理?
- iphone app为什么会被打回来,如何制止?
- iphone应用程序的项目基本结构?
- 编译语言和解释语言的区别 解释语言需要解释器,编译语言直接编译
- 给用户推送的通知的伪代码 register 得到一个device token
- 什么是动态链接库和静态链接库?调用一个类的静态方法需不需要release?
- OC中的数字对象都有哪些,简述它们与基本数据类型的区别是什么
- ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?
- objc优缺点
- objective-c中的词典对象、可变词典对象是哪个,初始化一个含有两个键值对的可变词典对象,并动态的添加和删除一条记录,输出第一条记录
- 写一个NSString类的实现+ (id)initWithCString:(constchar *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
- UITableView的重用机制?如何在一个view上显示多个tableView,tableView要求不同的数据源以及不同的样式 (要求自定义cell), 如何组织各个tableView 的delegate和dataSource?请说说实 现思路?在一个tableView中需要自定义多种样式的cell(两种或三种),通常你如何实现,说 说思路即可?UITableView的那些元素是可以自定义的?
- 一个tableView是否可以关联两个不同的数据源?你会怎么处理?
- 在一个对象释放前.如果他被加到了notificationCenter 中,在notificationcenter中remove这个对象可能会出现什么问题?
- 你连接服务器用的是什么方法,如果请求过程中,网络出了问题这么办?
- 委托是什么?委托的property声明用什么属性?为什么?
- fmmpeg框架(了解一下)、fmdb框架(了解一下)、320框架(了解一下)
- 说说UISplitViewController的使用机制
- 你了解哪些加密方式?
- 请简述cocoa中 NSWindowController类的作用?
- 请用objective - c实现将一段NSString字符串放入剪贴板的代码,并加中文注释?
- 请用objective - c 实现获得当前运行模块的路径,并添加中文注释?
- 不使用继承,为NSStirng类添加新方法 myPrint?
- 单链表、多链表区别?
- 制作相册,写思路和步骤
- 做过哪些动画,举例说明
- 目标-动作机制
- 类工厂方法是什么
- 为什么有些4.0独有的objective-c 函数在3.1上运行时会报错.而4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?
- 为什么4.0独有的c函数在3.1的机器上运行不会报错(在没有调用的情况下?)而4.0独有的类名在3.1的机器上一运行就报错?
- 什么是m3u8?如何播放相关的视频?
- 介绍一下soap协议?
更多推荐
iOS知识点(3)
发布评论