天天看点

iOS零散知识点

1.通过UIDevice类的model属性可以得知当前设备是什么,比如模拟器、iPhone、iPad还是iPod。

2.使屏幕不变暗:[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

3.UILabel多行文本 (1)UILabel可以显示多行文本,它有一个属性叫numberOfLines,可以制定行的数量,超过则不显示。 (2)当Label的尺寸超过指定行数对应的高度时,文字会在UILabel的垂直中间的位置上,上下会留白。 (3)当numberOfLines属性指定为0时,则不限制行数。这时候就需要根据显示的文本内容来确定对应显示区域的大小,然后动态设置label的size。 (4)使用这个特性,会比UITextView有一个好处:UITextView显示内容时上下左右会留空白,造成在确定其Frame时会存在误差。而UILabel则不存在这个问题。

4.UISegmentControl类中两个没有用过的方法:可以对UISegmentControl界面进行定制 (1)-setWidth:forSegmentAtIndex: (2)-setImage:forSegmentAtIndex;

5.去掉iOS桌面图标上的高亮效果的办法:在info.plist文件中加一个字段,Icon already includes gloss effects,选中,意思就是图标已经包含高亮效果,不用系统再自动添加了。

6.UITableView有两个属性,tableHeaderView,tableFooterView,用来添加表视图的头和尾,它不同于section的头和尾。

7.给控件加边框,圆角: (1)添加QuartzCore.framework (2)代码: [view.layer setBorderColor:[[UIColor redColor] CGColor]]; [view.layer setBorderWidth:1.0f]; [view.layer setCornerRadius:8.0f]; [view.layer setMaskToBounds:YES];

8.自定义导航栏视图的几个方法: (1)添加自定义title视图:self.navigationItem.titleView = xxx; (2)添加左右自定义按钮:     UIBarButtonItem *btItem = [[UIBarButtonItem alloc] initWithCustomView:xxx];     self.navigationItem.rightBarButtonItem = btItem;     或者:     self.navigationItem.rightBarButtonItems = [NSArray arrayWithObject:btItem]; (3)定制导航栏背景:     iOS5之后,使用UINavigationBar的setBackgroundImage:forBarMetrics:方法可以定制导航栏背景。     iOS5之前,新增一个UINavigationBar的扩展,重写drawRect方法,代码如下:     -(void)drawRect:(CGRect)rect {           UIImage *image = [UIImage imageNamed: @"navBarBK.png"];           [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];       }

9.裁剪图片: UIImage *image = xxx; CGImageRef newImageRef = CGImageCreateWithImageInRect(image.CGImage,rect); UIImage *newImage = [[UIImage alloc] initWIthCGImage:newImageRef];

10.让iOS程序在iOS4.0以及之后没有多任务,即按下home键之后程序直接退出:在info.plist中加入一个字段,Application does not run in bacground,打钩。

11.获取info.plist的内容:[[NSBundle mainBundle] infoDictionary];

12.屏幕截图: UIView *currentView = xxx; UIGraphicsBeginImageContext(currentView.bounds.size); [currentView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //保存到相册 UIImageWriteToSavedPhotosAlbum(viewImage,nil,nil,nil);

13.Security.framework (1)使用Security.framework可以实现钥匙串访问,读写,但是只能在真机上使用,模拟器会报错。可以用来保存一些私密数据,不用再为加密烦恼。 (2)苹果封装了KeychainItemWrapper类,用来对钥匙串进行操作。该类通过一个表明身份的字符串和访问组字符串来初始化。实例方法如下: - (id)initWithIdentifier: (NSString *)identifier accessGroup:(NSString *) accessGroup; - (void)setObject:(id)inObject forKey:(id)key; - (id)objectForKey:(id)key; - (void)resetKeychainItem; (3)钥匙链不会随着程序的卸载或者固件重装被清除,可以用来维护持久的信息,例如可以判断某台设备是否是第一次安装某软件。

14.loadView和ViewDidLoad的区别 (1)viewDidLoad方法在控制器view创建成功之后调用,不管是通过nib初始化还是通过loadView方法初始化的。 (2)当view被请求,但是view为nil时,loadView方法就会被调用,一般用于使用代码来生成控件。

15.在应用中加入WIFI提示框的方法: 如果iOS程序用到了WIFI,在没有WIFI网络连接的情况下,需要WIFI连接提醒,只需要在info.plist中加入如下两个键值即可: Applicatioin uses Wi-Fi    YES SBUsesNetWork                3

16.通过字符串加载类名: id object = [[NSClassFromString(@"Class1") alloc] init];  效果和下面一样:id object = [[Class1 alloc] init]; 但是如果Class1不存在,上面的方法会返回nil,而下面的方法会报错。

17.UIWebView的使用: (1)使用webView的loadRequest方法,可以加载本地或者网络的html文件。 (2)使用UIWebViewDelegate,可以获取浏览器网页开始加载和加载完毕事件,从而可以用来根据这些状态添加我们自己的UI界面,比如等待视图。也可以获取浏览器当前打开网页的网址,根据当前网址,我们也可以有自己的UI动作。 (3)通过stringByEvaluatingJavaScriptFromString方法,可以在浏览器控件外部调用JavaScript脚本。

18.当应用crash时,捕获错误日志: (1)首先声明发生异常时的回调函数,格式如下:      void MyUncaughtExceptionHandler(NSException *exception) {}      通过NSException对象,可以获取错误时间,错误原因,错误堆栈。 ()设置捕获回调:NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler);

19.MPMoviePlayerController可以播放在线视频和音频(只支持Http Live Stream协议),以及本地的视频音频。支持的格式仅限于苹果规定支持的格式。

[email protected]和#import的区别: (1)import会包含这个类的所有信息,包含实例变量和方法。而@Class只是告诉编译器,声明的是类的名称,至于这个类是如何定义的,先不用考虑,后面再告诉你。 (2)一般@Class只放在interface中,在实现类中,同时需要用@import来告诉编译器类里面的具体内容。 (3)使用@Class会增加编译效率。 (4)使用@Class可以解决循环依赖关系的问题。

21.StringWithFormat和@"str"的区别: (1)@"str",没有引用计数效果,引用计数为-1,调用retain也没用。 (2)stringWithFormat使用自动释放,创建完成时,引用计数为1。

22.iOS中,int是4个字节,short是2个字节,char是1个字节,long int也是4个字节。一个字节8位。

[email protected] 、@protected 、@private只会影响它的子类的访问权限,不会影响到类本身变量的访问权限。

24.在LLVM3.0编译器中,支持将实例变量写到实现文件中,可实现私有的成员变量。示例代码如下: @implementation MyViewController{     NSString *name; }

25.set方法的写法: if(_value != value){ [_value release]; _value = [value retain]; }

26.RunLoop监视操作系统的输入源,如果有事件数据,runLoop就发送消息,通知各个对象。它是一个一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用它的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。一个UI事件,一个Timer call,delegate call,都会是一个RunLoop。

27.自动释放池的release和drain的区别: (1)release在GC(自动内存回收)环境下是一个空操作,不做任何事情。 (2)在引用计数环境下,drain的行为和release是一样的,但是在GC环境下,它会调用object_collect_if_needed来触发GC。

28.NSInteger和int的区别: 在苹果的API实现中,NSInteger时一个封装,它会识别当前操作系统的位数,自动但会最大的类型,位数不一样。封装可以查看苹果文档。

29.进程间通讯的方式(iOS中基本用不到):管道,信号量,共享内存段,消息队列,以及socket。

30.线程通讯的方式:performSelector。比如: performSelector:onThread:withObject:waitUntilDone: performSelectorOnMainThread:withObject:waitUntilDone: cancelPreviousPerformRequestsWithTarget:selector:object:

31.如果一个NSArray中保存的是同种类型的对象,并且想对其中的每个对象都调用一个方法,可以使用makeObjectsPerformSelector:withObject:方法。

32.NSTime不是一个精准的定时器,当操作耗时很长或者阻塞,就可能错过一个点。

33.进程和线程的区别: (1)线程是CPU操作的最小单元,进程是系统资源分配时的最小单元。 (2)线程间共享内存空间,进程的内存空间时独立的。 (3)进程中包含线程。

34.UIScrollView主要使用了装饰器模式。Cocoa通过利用NSClipView实例装饰对象提供了滚动技术,让用户控制对象的哪个部分是可见的。装饰器模式通过复合给对象添加了公共的可重用能力,用于替换通过子类化添加这些能力,可以在运行时添加或者配置装饰器。

35.SQLite相关api: sqlite3_open、sqlite3_prepare_v2、sqlite3_bind_xxx、sqlite3_step、sqlite3_column_xxx、sqlite3_finalize、sqlite3_close。

36.类目(Catagory) (1)使用类目,可以在不子类化的情况下,给一个类添加功能。 (2)当类目中的方法名和类中的方法名冲突时,类目的方法会比类以及子类中方法的优先级高。 (3)如果不提供类名,则类目中定义的方法被视为必须实现的API,如果缺少实现代码,则编译器会报警。

37.将NSLog的内容重定向至文件: freopen([logFilePath cStringUsingEncoding:NSASCCIIEncoding], "a+", stderr);

38.extern关键字使用 (1)首先申明一个变量,比如:NSArray *resArray; 然后extern NSArray *resArray;      这样,在项目里面的任何类里面,都可以访问resArray这个变量。      此方法可以在一些需要共享数据的场合使用。 (2)extern "C",表示编译生成的内部符号使用c约定,大多出现在交叉C编译环境中。     __cplusplus只在c++中有定义。

39.从iOS4.0开始,iOS类库增加了对正则表达式的支持,类名为NSRegularExpression。

40.从iOS5.0开始,iOS类库增加了对JSON的支持,类名为NSJsonSerialization。

41.在编译环境中添加"NSZombieEnabled"变量,并且置为YES,可以捕获EXE_BAD_ACCESS错误,能让错误提示的更精细。但是添加了此变量之后,即使对象的引用计数为0,内存也不会被回收,应用程序的内存使用会一直增加。所以在编译完成之后,要把这个变量删掉。

42.自定义TableViewCell的背景颜色和选择后的颜色: 将TableViewCell的backgroundView和SelectBackGroundView修改成指定的View。

43.tableView:willDisplayCell:forRowAtIndexPath方法: 这个方法在TableView要使用cell去绘制row之前调用,这个方法给代理机会去设置基于状态的属性,并且早于TableView,比如选择状态的颜色或者背景的颜色等。

44.修改UIAlterView默认的Frame高度,使用委托: -(void)willPresentAlertView:(UIAlertView*)alertView {     alertView.frame =CGRectMake(5.f,1.f,100.f,200.f); }

45.由于TableView的cell重用机制,导致多个图片下载事件的回调会指向同一个cell。解决办法:在图像下载事件中记录当前cell的row,同时将cell的tag设置为row,当图片下载完毕时,先判断下载事件中记录的row和cell的tag是不是一致,如果一致,则显示图片到cell上,如果不一致,则不显示图像。

46.UIScrollView可以放大缩小显示的内容,它有一个参数用来控制缩放的幅度,zoomScale,默认是1.0。

47.让UIScrollView支持捏合动作: (1)实现代理方法:viewForZoomingInScrollView,返回当前需要伸缩的视图对象,比如UIImageView。当两个手指捏合时,视图对象的size的值将会被改变。 (2)设置scrollView的最大和最小伸缩倍数,maximumZoomScale、minimumZoomScale。 (3)重写scrollView的layoutSubviews方法,在此方法中,可以根据需要重置视图对象的x和y值,后者根据视图的size属性,重置scrollView的contentSize。

48.ios自定义键盘:UITextField有两个属性:inputView,inputAccessoryView。 (1)inputView含义:输入界面。当你想要某输入框的输入键盘使用自定义的键盘的话,可以自己创建一个键盘,然后把键盘视图赋值给这个属性。当点击此输入框时,弹出的键盘就是我们自己的键盘了。 (2)inputAccessoryView含义:辅助输入界面,一般放在键盘的上方。可以增加类似于"上一项"、"下一项"、"完成"等功能。