好程序员-ios开发小知识点

2024-04-18

好程序员-ios开发小知识点(精选6篇)

篇1:好程序员-ios开发小知识点

、程序启动画面大小

iOS设备现在有三种不同的分辨率:iPhone 320x480、iPhone 4 640x960、iPad 768x1024。以前程序的启动画面(图片)只要准备一个 Default.png 就可以了,但是现在变得复杂多了。下面就是 CocoaChina 会员做得总结

如果一个程序,既支持iPhone又支持iPad,那么它需要包含下面几个图片: Default-Portrait.png iPad专用竖向启动画面 768x1024或者768x1004 Default-Landscape.png iPad专用横向启动画面 1024x768或者1024x748 Default-PortraitUpsideDown.png iPad专用竖向启动画面(Home按钮在屏幕上面),可省略 768x1024或者768x1004 Default-LandscapeLeft.png iPad专用横向启动画面,可省略 1024x768或者1024x748 Default-LandscapeRight.png iPad专用横向启动画面,可省略 1024x768或者1024x748 Default.png iPhone默认启动图片,如果没有提供上面几个iPad专用启动图片,则在iPad上运行时也使用Default.png(不推荐)320x480或者320x460 Default@2x.png iPhone4启动图片640x960或者640x920 为了在iPad上使用上述的启动画面,你还需要在info.plist中加入key: UISupportedInterfaceOrientations。同时,加入值UIInterfaceOrientationPortrait, UIInterfacOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight

17、ASIHTTPRequest实现断点下载

-(IBAction)URLFetchWithProgress:(id)sender { [startButton setTitle:@“Stop” forState:UIControlStateNormal];[startButton addTarget:self action:@selector(stopURLFetchWithProgress:)forControlEvents:UIControlEventTouchUpInside];NSString*tempFile = [[[[NSBundle mainBundle] bundlePath]stringByDeletingLastPathComponent]stringByAppendingPathComponent:@“MemexTrails_1.0b1.zip.download”];if([[NSFileManager defaultManager] fileExistsAtPath:tempFile]){ [[NSFileManager defaultManager] removeItemAtPath:tempFile error:nil];} [self resumeURLFetchWithProgress:self];}(IBAction)resumeURLFetchWithProgress:(id)sender { [resumeButton setEnabled:NO];[startButton setTitle:@“Start” forState:UIControlStateNormal];[startButton addTarget:self action:@selector(stopURLFetchWithProgress:)forControlEvents:UIControlEventTouchUpInside];[networkQueue cancelAllOperations];[networkQueue setShowAccurateProgress:YES];[networkQueue setDownloadProgressDelegate:progressIndicator];[networkQueue setDelegate:self];[networkQueue setRequestDidFinishSelector:@selector(URLFetchWithProgressComplete:)];ASIHTTPRequest*request=[[[ASIHTTPRequest alloc] initWithURL:[NSURLURLWithString:@“http://9991.net/blog/mp3/2.mp3”]] autorelease];[request setDownloadDestinationPath:[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@“MemexTrails_1.0b1.mp3”]];[request setTemporaryFileDownloadPath:[[[[NSBundle mainBundle] bundlePath]stringByDeletingLastPathComponent]stringByAppendingPathComponent:@“MemexTrails_1.0b1.zip.down”]];[request setAllowResumeForFileDownloads:YES];[networkQueue addOperation:request];

}(IBAction)throttleBandwidth:(id)sender { if([(UIButton *)sender state] ==YES){ [ASIHTTPRequest setMaxBandwidthPerSecond:ASIWWANBandwidthThrottleAmount];} else { [ASIHTTPRequest setMaxBandwidthPerSecond:];} }

18、Safari 启动本地app

在plist文件中加入URL types 结构如下图,在Safari中地址栏输入 设置的字符串,比如设置的是

QQ,地址栏输入 QQ:// 就可以起点本地应用。

19、拖到视频进度与滑动手势冲突解决办法

#pragma mark10.1.x system */ } else if(floor(NSAppKitVersionNumber)<= NSAppKitVersionNumber10_2){ /* On a 10.210.3.x system */ } else if(floor(NSAppKitVersionNumber)<= NSAppKitVersionNumber10_4){ /* On a 10.410.5.x system */

  } else { /* 10.6 or later system */ } 跟以上一样在 NSObjCRuntime.h中用定义了NSFoundationVersionNumber全局常量 小结:详解IOS SDK兼容性引导的内容介绍玩玩了,希望通过本文的学习能对你有所帮助!原文地址:http://blog.csdn.net/diyagoanyhacker/article/details/6673344

26、NSDate 与 NSString 转换

1、将字符串 “Fri Nov 11 09:06:27 +0800 2011” 转换成Date: NSDateFormatter *format = [[NSDateFormatter alloc] init];NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@“en-US”];[format setLocale:enLocale];[enLocale release];[format setDateFormat:@“EEE MMM dd HH:mm:ss ZZZ yyyy”];NSDate *dateTime = [format dateFromString:message];

将Date转换成字符串: NSDate *date = [NSDate date];NSString * dateString = [format stringFromDate:date];//字符串转换成NSDate 需要设置NSLocale 否则真机上会失败。

2、获取当前时间,转化成字符串

NSDateFormatter * formatter = [[NSDateFormatteralloc]init];formatter.dateStyle = NSDateFormatterMediumStyle;formatter.timeStyle = NSDateFormatterMediumStyle;formatter.locale = [NSLocalecurrentLocale];self.timeLabel.text = [formatterstringFromDate:[NSDatedate]];

3、获取月、日、年、时、分、秒

NSDateFormatter *formatter =[[[NSDateFormatteralloc] init] autorelease];formatter.dateStyle = NSDateFormatterMediumStyle;formatter.timeStyle = NSDateFormatterMediumStyle;formatter.locale = [NSLocalecurrentLocale];

NSDate *date = [NSDatedate];

[formatter setTimeStyle:NSDateFormatterMediumStyle];NSCalendar *calendar = [[[NSCalendaralloc] initWithCalendarIdentifier:NSGregorianCalendar]autorelease];NSDateComponents *comps = [[[NSDateComponentsalloc] init] autorelease];NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;//int week=0;comps = [calendar components:unitFlags fromDate:date];int week = [comps weekday];int year=[comps year];int month = [comps month];int day = [comps day];[formatter setDateStyle:NSDateFormatterMediumStyle];// //This sets the label with the updated time.int hour = [comps hour];int min = [comps minute];int sec = [comps second];

NSLog(@“day%d”,day);NSLog(@“hour%d”,hour);NSLog(@“min%d”,min);NSLog(@“sec%d”,sec);

27、数组中存储数据查询

NSMutableDictionary *userDic1 = [NSMutableDictionary dictionaryWithCapacity:10];NSMutableDictionary *userDic2 = [NSMutableDictionary dictionaryWithCapacity:10];[userDic1 setValue:@“Li” forKey:@“name”];

NSArray *userArray = [NSArray arrayWithObjects:userDic1,userDic2,nil];NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@“SELF.name contains[cd] %@ ”,@“L”];

NSMutableArray *searchArray = [NSMutableArray arrayWithArray:[userArray filteredArrayUsingPredicate:namePredicate]];

NSLog(@“searchArray == %@”,searchArray);

28、CoreText 总结

(1)NSAttributedString NSAttributedString 可以将一段文字中的部分文字设置单独的字体和颜色。与UITouch结合可以实现点击不同文字触发不同事件的交互功能。主要方法:

-(void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;可以设置某段文字的字体名称,颜色,下滑线等信息。

-(void)removeAttribute:(NSString *)name range:(NSRange)range;移除之前设置的字体属性值。

-(void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;存储某段文字包含的信息(包括字体属性或其它,也可以存储一些自定义的信息)-(NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range;通过location来获取某段文字中之前存储的信息NSDictionary

//设置字体

CTFontRef aFont = CTFontCreateWithName((CFStringRef)textFont.fontName, textFont.pointSize, NULL);if(!aFont)return;CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits(aFont, 0.0, NULL, kCTFontItalicTrait, kCTFontBoldTrait);//将默认黑体字设置为其它字体 [self removeAttribute:(NSString*)kCTFontAttributeName range:textRange];[self addAttribute:(NSString*)kCTFontAttributeName value:(id)newFont range:textRange];CFRelease(aFont);CFRelease(newFont);

//设置字体颜色

[self removeAttribute:(NSString*)kCTForegroundColorAttributeName range:textRange];[self addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)textColor.CGColor range:textRange];

//设置对齐 换行

CTTextAlignment coreTextAlign = kCTLeftTextAlignment;CTLineBreakMode coreTextLBMode = kCTLineBreakByCharWrapping;CTParagraphStyleSetting paraStyles[2] = { {.spec = kCTParagraphStyleSpecifierAlignment,.valueSize = sizeof(CTTextAlignment),.value =(const void*)&coreTextAlign}, {.spec = kCTParagraphStyleSpecifierLineBreakMode,.valueSize = sizeof(CTLineBreakMode),.value =(const void*)&coreTextLBMode}, };CTParagraphStyleRef aStyle = CTParagraphStyleCreate(paraStyles, 2);[self removeAttribute:(NSString*)kCTParagraphStyleAttributeName range:textRange];[self addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)aStyle range:textRange];CFRelease(aStyle);

(2)Draw NSAttributedString

CGContextRef cgc = UIGraphicsGetCurrentContext();CGContextSaveGState(cgc);

//图像方向转换

CGContextConcatCTM(cgc, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, self.bounds.size.height), 1.f,-1.f));

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)weiBoText);

CGMutablePathRef path = CGPathCreateMutable();CGPathAddRect(path, NULL, drawingRect);textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);CGPathRelease(path);CFRelease(framesetter);

CTFrameDraw(textFrame, cgc);CGContextRestoreGState(cgc);(3)图文混排

CTFrameRef textFrame // coreText 的 frame CTLineRef line // coreText 的 line CTRunRef run // line 中的部分文字 相关方法:

CFArrayRef CTFrameGetLines(CTFrameRef frame)//获取包含CTLineRef的数组 void CTFrameGetLineOrigins(CTFrameRef frame, CFRange range, CGPoint origins[])//获取所有CTLineRef的原点

CFRange CTLineGetStringRange(CTLineRef line)//获取line中文字在整段文字中的Range CFArrayRef CTLineGetGlyphRuns(CTLineRef line)//获取line中包含所有run的数组 CFRange CTRunGetStringRange(CTRunRef run)//获取run在整段文字中的Range CFIndex CTLineGetStringIndexForPosition(CTLineRef line, CGPoint position)//获取点击处position文字在整段文字中的index CGFloat CTLineGetOffsetForStringIndex(CTLineRef line, CFIndex charIndex, CGFloat* secondaryOffset)//获取整段文字中charIndex位置的字符相对line的原点的x值 主要步骤:

1)计算并存储文字中保含的所有表情文字及其Range 2)替换表情文字为指定宽度的NSAttributedString

callbacks.version = kCTRunDelegateVersion1;callbacks.getAscent = ascentCallback;callbacks.getDescent = descentCallback;callbacks.getWidth = widthCallback;callbacks.dealloc = deallocCallback;

CTRunDelegateRef runDelegate = CTRunDelegateCreate(&callbacks, NULL);NSDictionary *attrDictionaryDelegate = [NSDictionary dictionaryWithObjectsAndKeys:(id)runDelegate,(NSString*)kCTRunDelegateAttributeName, [UIColor clearColor].CGColor,(NSString*)kCTForegroundColorAttributeName, nil];

NSAttributedString *faceAttributedString = [[NSAttributedString alloc] initWithString:@“*” attributes:attrDictionaryDelegate];

[weiBoText replaceCharactersInRange:faceRange withAttributedString:faceAttributedString];[faceAttributedString release];3)根据保存的表情文字的Range计算表情图片的Frame textFrame 通过CTFrameGetLines 获取所有line的数组 lineArray 遍历lineArray中的line通过CTLineGetGlyphRuns获取line中包含run的数组 runArray 遍历runArray中的run 通过CTRunGetStringRange获取run的Range 判断表情文字的location是否在run的Range 如果在 通过CTLineGetOffsetForStringIndex获取x的值 y的值为line原点的值 4)Draw表情图片到计算获取到的Frame

(3)点击文字触发事件

主要步骤:

1)根据touch事件获取点point 2)textFrame 通过CTFrameGetLineOrigins获取所有line的原点 3)比较point和line原点的y值获取点击处于哪个line 4)line、point 通过CTLineGetStringIndexForPosition获取到点击字符在整段文字中的 index

5)NSAttributedString 通过index 用方法-(NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range 可以获取到点击到的NSAttributedString中存储的NSDictionary 6)通过NSDictionary中存储的信息判断点击的哪种文字类型分别处理

篇2:好程序员-ios开发小知识点

1、UITableView能够绑定多个数据源。(错)

2、一个UIViewController可以管理多个UITableView。(对)

3、Object-c的类可以多重继承。(错)

4、objective-c类里面的方法只有两种, 静态方法和实例方法。(对)

5、NSFileManager和NSWorkspace在使用时都是基于进程进行单件对象的实例化。(对)

6、用类别增加方法时,不能与原来类中的方法产生名称冲突。(错)

7、frame指的是该view在本身坐标系统中 的位置和大小。(错)

8、method是一个方法的名字,selector是一个组合体。(错)

9、ARC是编译特性,不是运行时特性,在编译时,编译器会自动加上释放代码。(对)

10、从iOS4之后,Safari支持全屏浏览,Siri支持普通话。(对)

二、填空题(每空2分,共20分)

1、iOS是使用Objective-C语言编写的,使用该语言开发的Cocoa是一款功能强大的用户界面工具包,也是iOS的核心。

2、数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。链表恰好相反,其中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。

3、发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作。而发送异步请求不会阻塞主线程,会建立一个新的线程来操作,之后程序可以继续运行。

4、autorelease只是把Object放入了当前的autorelease pool中,当它被释放时,其中的所有Object都会被调用Release。

5、作为Objective-C导入头文件的关键字,#import<>用来包含系统的头文件,#import””用来包含用户头文件。

三、简述题(每题4分,共20分)

1、delegate和notification有什么区别,什么情况下使用?

答:delegate:消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

notification:消息的发送者告知接收者事件已经发生或者将要发生,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

2、Object-C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

答:线程创建有三种方法:使用NSThread创建、使用 GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue。

在主线程执行代码,方法是 performSelectorOnMainThread。

如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone。

3、iOS有哪些数据持久化方式?

答:四种:属性列表、对象归档、SQLite3和Core Data。

4、Objective-C如何对内存管理的,说说你的看法和解决方法?

答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。解决方法的话:谁持有,谁释放。

5、如何对iOS设备进行性能测试?

答:Profile-> Instruments->Time Profiler。

四、问答题(每题10分,共20分)

1、什么是MVC,为什么使用MVC,有什么好处?描述一下iOS SDK中如何实现MVC的开发模式。

答:MVC分别为:模型(Model),视图(View)和控制Controller)。

模型(Model):即“数据模型”,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。视图(View):视图层能够实现数据有目的显示。

控制器(Controller):控制器起到不同层面间的组织作用,用于控制应用程序的流程。对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

2、请阐述UIViewController的生命周期,包括代码的执行顺序。答:当一个视图控制器被创建,并在屏幕上显示的时候。代码的执行顺序

// 视图显示在屏幕上的顺序

1、alloc 创建对象,分配空间。

2、init(initWithNibName)初始化对象,初始化数据。

3、viewload 从nib载入视图, 这一步不需要去干涉。除非没有使用xib文件创建视图。

4、viewDidLoad 加载完毕,可以进行自定义数据以及动态创建其他控件。

5、viewWillAppear 视图将出现在屏幕之前,马上这个视图即将显示在屏幕上。

6、viewDidAppear 视图已在屏幕上渲染完成。

// 视图将被从屏幕上移除的顺序

1、viewWillDisappear 视图将被从屏幕上移除之前执行。

2、viewDidDisappear 视图已经被从屏幕上移除。

3、dealloc 视图被销毁,此时需要在init和viewDidLoad中创建的对象进行释放。

4、viewDidUnload 出现内存警告在内存不足时执行,并对所有非当前显示的controller执行。本视图的所有子视图将被销毁,以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建的对象释放内存。因为当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。

五、论述题(20分)

篇3:好程序员-ios开发小知识点

关键词:JBuilder;Java小应用程序;Applet

中图分类号:TP311.52 文献标识码:A文章编号:1007-9599 (2013) 05-0000-02

JBuilder实质上是一种可视化的开发Java的工具。JBuilder能够在Java2的平台上进行商业化的数据库、程序开发。由于JBuilder支持J2EE,因此能够互换企业Java应用程序。而Java小应用程序能够推动整个Web的发展,其所用的浏览器支持Java applet。只要浏览器在HTML文档内发现了,那么就会从中获取Java类文件,进行加载并开始运行。JBuilder2005中采用了JDK1.5。Java所使用的开发工具包也是JDK1.5,这就导致Java2出现了较多新功能。比如Swing控件能够让用户的界面变得很美观。而内部的UML代码具有可视化的功能,能够进行代码审核。支持多语控制系统。

1生成Applet框架

JBuilder2005中有三种工具可以帮助生成、测试Applet程序,即Applet Wizard、AppletTestBed以及Applet Viewer。其中,Applet Wizard能及时的建立HTML文件,对应Applet的基本结构。而AppletTestBed、Applet Viewer能测试整个Applet的执行程度。

其实,如果用JBuilder来生成Applet框架,相对比较容易。我们使用Applet Wizard开始生成Applet框架。启动Applet Wizard先打开Object Gallery对话框,再选取好Applet图标。然后在name栏里将HelloApplet输入,调整好directory栏内的路径。将default path、JDK版本、Backup path等都选为默认值,并修改class Javadoc fields内的author、Title、Description、Company以及version字段的值。修改完点完成。

这时便能够设置输入Applet内的具体参数了。首先,用Applet Wizard在HTML文件中<applet>标签内生成<param>,并在其他类的文件中介入程序代码。将name调整为param0。如果选择了Generate HTML Page,Applet Wizard会生成一个带着<applet>标签的HTML文件。为了改变<applet>的属性,我们可以使用Width、Name、Height字段设置。在完成离开至工程窗格后,会发现已经产生了两个文件HelloApplet.html、HelloApplet.java。Applet框架基本已经生成。

2设计Applet用户界面

对于JBuilder2005而言,最好的设计用户界面工具为HelloApplet。

首先在JBuilder编辑器内打开HelloApplet.java文件,然后选择Design页签。将组件this节点的属性从default layout转变成为BorderLayout,并在Applet中介入两个Panel容器。在AWT页签之内选择java.awt.Panel,并点击this节点。就会出现新的panel1。将panel1内的Constraints设为North属性。再做一个panel2,将属性改为Center。

再将panel1、panel2改动名称,panel1改为UpperPanel,panel2改为LowerPanel。Panel1的Background改为Light Gray属性。Panel2的background改为White属性。只要背景颜色有差异就可以。把LowerPanel中的layout改为CardLayout属性,并选择java.awt.Panel组件,点设定好的LowerPanel节点,动作加入Panel。此时又会出现panel1和panel2。把Panel1、Panel2都更换属性设置和背景属性。做好这些以后便可以保存工程。整个Applet用户界面已经生成,只需再加入一些UI组件便可。

3测试Java小应用程序

等到开发完毕之后,在JBuilder中点击.html文档,则可以看到应用小程序。为了测试其执行结果能力,Sun Microsystems的Applet Viewer,或者是JBuilder 2005的AppletTestBed。

只要我们选择Run | Run Project,就会自动启动AppletTestBed,执行main class。首先,选择Project,将Project Properties打开。切换到Run窗格,按住New按钮组建新运行配置,或者是按Edit重新编辑。然后开始编辑main class内容。

如果要浏览Applet,可选择一个有着<applet>标签的HTML文件。需要浏览时,只需在HTML文件中右击一下,选择Run using时期的配置,则能够进行启动。

4开发过程中应注意的问题

4.1JDK版本不同

由于Java技术的发展,JDK版本都升级到了好几层。开发人员总是喜欢新JDK版本来进行开发,但用户却很少对浏览器版本进行更新。因此,就会出现一部分人能够使用,而另一部分人因为没有及时对浏览器更新,不能够使用。对此,只需让公司员工定期更新Web浏览器则可。或者在网页中做出相应的提示。倘若浏览器的JDK版本不合格,可使用plug-in和Java Web Start来处理。

4.2安全性问题

Applet执行容易受到某些网络病毒和软件篡改程序代码,致使客户端信息受损。一般Applet都集中在Sandbox之内,即安全环境中。网络是开放式的,被窃取和拦截的频率比较高。在JBuilder开发时,需要注意安全性的问题。

5结束语:

用JBuilder开发Java小应用程序,能够减少以往开发Java的复杂性。在开发Java小应用时,先设置好具体的Applet框架,然后设计好美观的用户界面。JBuilder比其他的开发软件更便捷,并且它具有全新的安全检测能力,能够解决Applet中遗留的问题。

参考文献:

[1]谢欢,何培英.基于JBuilder平台的J-Link应用程序开发技术[J].郑州轻工业学院学报(自然科学版),2008,3.

[2]沈悦.J2ME开发及JBuilder工具的应用[J].重庆三峡学院学报,2003,1.

[3]雷小锋.用JBuilder开发Java小应用程序[J].电脑编程技巧与维护,2001,9.

[4]陈爱平,闵华松,刘启林.JBuilder中使用Java Applet访问数据库[J].电脑开发与应用,2005,8.

[5]张军.多层架构及其在JBuilder6.0中的实现[J].重庆邮电学院学报(自然科学版),2004,2.

[作者简介]张金波(1971.3-),性别:女,民族:汉,籍贯:辽宁省辽阳市,

学历:大学本科,职称:副教授,研究方向:软件开发,从事工作:教学

篇4:好程序员-ios开发小知识点

美国上市公司

亿元级外企IT培训企业

100个iOS开发/设计程序员面试题汇总

无论是对于公司还是开发者或设计师个人而言,面试都是一项耗时耗钱的项目,本文作者Cameron Banga从编程、设计、App Store等各个方面对iOS开发者及设计师在面试时可能会遇到的问题进行了筛选与汇总。一方面,能够帮助HR在短时间内获取更多反馈信息,更好地甄选合适人选,而iOS开发者及设计师在寻找相关工作时,也可作为参考,为面试做好万全准备。

一、常见问题

你昨天/这周学习了什么?

你为什么热衷于软件开发?

你对哪一种控制系统比较熟悉?

是否参与过GitHub项目?

是否参与过GitHub或其他同类型网站的iOS开源项目?

请描述一下你的iOS应用开发流程。

是否熟知CocoaPods?它是什么?如何运行的?

请概括一下你对软件授权的理解,及其对软件开发的影响。

请概括一下你在构建iOS应用时的测试过程。iOS应用如何实现对其他语言、日期格式以及货币单位的支持?

请描述一下Instruments及其作用。

二、关于iOS技术

请解释一下Handoff是什么,并简述它是如何实现iOS、Mac/网页应用互通的。

iCloud包含了哪些技术与服务?

iOS扩展是指?能否列举一些热门或常见的范例?

HealthKit是什么?

HomeKit是什么?

Apple Pay是什么?能否描述一下如何在应用中使用Apple Pay?

请解释一下iOS应用沙盒机制。

VoiceOver是什么?请举例解释一下iOS中的辅助功能(Accessibility)。开发者如何使用这些功能?

iOS应用是如何实现后台多任务处理(Multitasking)的?

Game Center针对iOS游戏有哪些功能?

iBeacons是什么?

美国上市公司

亿元级外企IT培训企业

Cocoa/Cocoa Touch是什么?

请概括一下Core Audio,Core Data以及Core Location各是什么。它们对iOS应用有何意义?

请描述SpriteKit和SceneKit的作用。

Metal是什么?

响应链(Responder Chain)是什么?它是如何发挥作用的?

按钮和其他控制方式对哪些操作做出回应?

AppDelegate扮演着什么样的角色?

请解释一下NSUserDefaults。就你而言,你会如何在磁盘中对数组对象进行序列化?

你会如何储存用户的认证信息?

请问何为Keychain服务?

为什么移动设备上的缓存和压缩是不可或缺的?

请解释一下~/Documents,~/Library和~/tmp。iOS中的~属于什么目录?

AirPlay是如何运行的?换做是你,你会如何通过编程提高应用的实用性以及演示效果?

传感器,IO以及WiFi、拨号等连接方式如何在iOS平台上运作?它们有何利用价值?请扼要地谈谈你的观点。

iPad 2,iPad mini 1-3,iPad Retina,iPad Air 2,iPhone 5、5S、6以及6+在硬件性能方面有何差异?这对注重性能的应用有何限制?

三、关于编程

Cocoa Touch包含什么?不包含什么?

为什么Cocoa Touch的类名称是以两个大写字母开头的?

Swift和Objective-C分别是什么?两者相比有何不同之处,又有何联系?

为什么Optional在Swift语言中非常重要?

请解释一下NSError。在Swift中,什么情况下能使用NSError,什么情况下不能?

请说明如何使用Instancetype及其重要性。

在Swift中,什么时候该用let,什么时候该用var?

为什么map函数必不可少?该在什么情况下使用它?

你会选择什么工具来追踪Bug?

如果在Cocoa中发现一个Bug,你会如何处理?

如果应用的新版本出现了Regression的情况,该如何补救?如何防止用户在使用过程中遇到新的Bug?

Objective-C的类是怎么执行的?Objective-C Runtime是如何实现的?

美国上市公司

亿元级外企IT培训企业

iOS是如何提高安全性,保护用户隐私信息的?

应用可以下载并即刻显示数据。如何根据MVC来判断下载的最佳位置?

MVC对代码库(Codebase)的设计有何影响?

Controller Life-Cycle以及View Life-cycle分别有哪些调试方法?

iOS使用的是哪些设计模式(Design Patterns)?你的代码库使用的是哪些设计模式?

iOS提供哪些线程?如何充分利用这些线程?

请简要描述一下UIScrollView的执行过程。它是如何响应手势识别(Gesture Recognizer)、多点触控(Multi-Touch)和Run Loop的?

你认为iOS需要添加或改进哪些API?

四、关于界面

iPhone5、6、6+以及iPad Air 2的屏幕分辨率分别是多少?

分辨率的计算单位是什么?

请解释一下Interface Builder的作用以及NIB文件的概念。

iOS UI的图像储存类型是什么?

请描述一下Storyboard和标准NIB文件的差别。

设备状态栏(Device Status Bar)是什么?高度如何?是否透明?在手机通话或者导航状态下,它是如何显示的?

导航栏(Navigation Bar)是什么?能否拿出你的iPhone,指出你下载的哪些应用运用了导航栏?

选项卡(Tab Bar)和工具栏(Toolbar)分别是什么?两者之间有何共同点和不同点?

表视图(Table View)是什么?集合视图(Collection View)又是什么?

什么时候用“弹出(Popover)”属性最为合适?

Split-view Controller是什么?

选取器视图(Picker View)适合存放哪类内容?

应该在什么情况下使用标签、文本域和文本视图?

分段控件(Segmented Control)的作用是什么?

模态视图(Modal View)是什么?

iOS通知属于什么类型?

五、关于设计

iOS应用图标是指什么?请尽可能详细地描述一下。

最小尺寸和最大尺寸的应用图标分别是什么样子的?

应用图标能否包含透明的部分?

美国上市公司

亿元级外企IT培训企业

Newsstand的图标与常规应用有何不同?

请解释一下启动画面(Launch Images)。

自动布局(Auto Layout)的作用是什么?请概括一下它是如何运行的。

设计软件时为什么要加上动画?

请描述一下软件设计中的交互和Feedback有什么作用。

设计iPhone和iPad应用时,应分别考虑哪些因素?

请描述一下原型设计对于软件开发的意义。其作用是什么?

六、关于App Store

应用内购买(In-App Purchases)是怎么回事?IAP能够为用户带来哪些新体验?

你是否在App Store上发布过应用?能否概括一下过程?

iTunes Connect是什么?

Provisioning Profiles是指?

App ID是什么?

iOS的开发和发布签名证书有何异同?

如何使用TestFlight?通过Ad-hoc发布应用的话,该如何使用UUID?

应何时验证购买收据?

发布iAds(苹果平台广告)有哪些要求?

七、趣味问答

最近有没有开发什么好玩的东西?你最引以为豪的作品是什么?

谈一谈你常用的开发工具都有哪些优势?

你最敬佩的独立Mac或者iOS应用开发者是谁?

最喜欢什么项目?哪种类型的?

你觉得Xcode有哪些需要改进的地方?

iOS上你最喜欢哪些API?

是否有最中意的错误报告?

你最爱以哪种方式来检验一项新技术是否好用?

为什么词典被称作Dictionaries,而不是HashTable或HashMap?

篇5:好程序员-ios开发小知识点

如何能在短短的30分钟或1小时内,快速识别出,坐在你对面的应聘人员,是否适合你的team。厦门博看文思来支招:

1.倾向于招什么样的软件开发人员

-经历过历练的人

吃过苦的,比如以前工作,经常被外派出差,又如曾在业内都知道以加班多而著称的公司呆过,还有些,留过学,但都是自己边打工边读书的,等等。

这些人员,入职后,通常都是能干活,能作为骨干。

-思路清晰,思想活跃的人

让谈谈自己现在的产品,如果能清晰表述,有条理,会发散,但又能适当控制住,并收回到原话题。谈到技术问题和解决过的难题时,眼中有光芒:)

这些人员,今后工作中,学习能力强,对解决难题有帮助,能作为中坚。

-坦诚、坚定、平和的人

面试中,坦诚,目光坚定。有时坦诚到甚至于显得有点木讷:)

我曾经遇到一个,面试下来,我最后介绍我们产品中用到的技术,他对这些技术知之不多,最后他说,“我可能不是非常适合,我知道一个朋友,他可能更适合。”我综合评估后,最后还是选了他,事实证明,他后来做的很不错。

坦诚坚定的人,会有恒心去学习,去解决问题。这些人员会作为team的基石。

-有缺陷的人才

这是一个朋友(lance)的想法,我认为还是有道理的。

大公司,会看重综合素质,而如果是小公司,可以考虑选择一些有缺陷的人才。所谓有缺陷,是指,比如他英语很差,或沟通不清晰,但他能用程序员该有的思维去思考问题。这样的人员,通常进不了大公司,故会相对踏实地呆在一家公司,做好自己的工作。

2.谨慎考虑这样的开发人员

-太活泼,太易兴奋

太易兴奋,说到投机处,“是是是是,对对对对。。”,又蹦又跳,还时不时来点,“oh yeah,you are right“,然后还摆个 v 手型。讨论问题,不易固守在技术问题本身,时常跑到“我们产品中用到的技术(或第3方产品)很强,我挺他们,不可能有问题”,又或者“我们对客户要强势,我们要坚持我们的产品没问题“。

软件开发工作本身,显得比较沉闷,优秀的技术人员,都略显有些内向,因为解决问题,很多时候需要耐得住寂寞,时刻保持相对冷静。

篇6:好程序员-ios开发小知识点

1、IOS中常用的数据存储方式有哪些?

答:1.数据存储有四种方案,NSUserDefault,KeyChain,File,DB.2.其中File有三种方式:plist,Archiver,Stream 3.DB包括core Data和FMDB

2、说一说你对sqlite的认识

SQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特点:

1.基于C语言开发的轻型数据库

2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)

3.SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的情况时)

4.建立连接后通常不需要关闭连接(尽管可以手动关闭)

在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):

1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。

2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;

4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。

3、说一说你对FMDB的认识

FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架非常轻量级但又不失灵活性,而且更加面向对象。FMDB有如下几个特性:

1.FMDB既然是对于libsqlite3框架的封装,自然使用起来也是类似的,使用前也要打开一个数据库,这个数据库文件存在则直接打开否则会创建并打开。这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依

赖此对象。

2.对于数据库的操作跟前面KCDbManager的封装是类似的,在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等。

3.我们知道直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。

4.将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。

4、说一说你对Core Data的认识

Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过

程通常分为以下几个步骤:

1.创建管理上下文

创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。

经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。

2.查询数据

对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。

3.插入数据

插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。

4.删除数据

删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。

5.修改数据

修改数据首先也是取出对应的实体对象,然后通过修改对象的属性,最后保存上下文。

5、OC中有哪些数据存储方式,各有什么区别? OC中有四种数据存储方式: 1).NSUserDefaults,用于存储配置信息 2).SQLite,用于存储查询需求较多的数据 3).CoreData,用于规划应用中的对象

4).使用基本对象类型定制的个性化缓存方案.NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。

数据存储这一块,面试常问, 你常用哪一种数据存储?什么是序列化?sqlite是直接用它还是用封装了它的第三方库?尤其是会问sqlite和core data的区别?

5、IOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要做相应的改变,例如用户执行撤销命令。当coredata在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型, 但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对

一、对多的关系。

6、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

编写SQL语句来操作原来表中的字段 增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名字段类型;• 删除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

.修改表字段

ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

7、SQLite数据存储是怎么用?

添加SQLite动态库:

导入主头文件:#import 利用C语言函数创建打开数据库,编写SQL语句

8、简单描述下客户端的缓存机制?

1>缓存可以分为:内存数据缓存、数据库缓存、文件缓存 2>每次想获取数据的时候 3>先检测内存中有无缓存

4>再检测本地有无缓存(数据库文件)5>最终发送网络请求

6>将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取

9、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

1>CoreData是对SQLite数据库的封装

2>CoreData中的NSManagedObjectContext在多线程中不安全

3>如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext 4>每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁

10、core data数据迁移

博客地址: http://blog.csdn.net/jasonblog/article/details/17842535

11、FMDB的使用和对多张表的处理

博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398

12、说说数据库的左连接和右连接的区别

上一篇:洞河镇创建党建示范村活动的实施方案下一篇:网络安全教育班会总结