iOS学习笔记总结整理

 

来源:http://mobile.51cto.com/iphone-386851_all.htmphp

学习IOS开发这对于一个初学者来讲,是一件很是挠头的事情。其实学习IOS开发无外乎平时的积累与总结。下面为你们整理了一部分的iOS学习笔记总结整理,但愿对你们有所帮助。html

一.内存管理状况编程

  1. NSString *homePath = NSHomeDirectory(); 
  2. NSString *docPath = [homePath stringByAppendingFormat:@"/Documents"]; 
五.UIActionSheet 按钮列表
六.旋转
     1- interfaceOrientation属性查询当前的界面方向。
     2- rotatingHeaderView方法来查询当前导航视图。
     3- rotatingFooterView来查询当前的标签条。
七.快速拨打电话接口
openURL能帮助你运行Maps,SMS,Browser,Phone甚至其余的应用程序。这是Iphone开发中我常常须要用到的一段代码,它仅仅只有一行而已。
  1. [UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]; 
这个程序经过基础的协议支持拨打电话的功能。
摘自: http://blog.csdn.net/smilelance/article/details/6213125
八.区分设备类型的方法
打电话功能只有iPhone支持,对于其余设备对应按钮应该禁用。
1. 用[UIDevice currentDevice].model,这个返回的是一个NSString,你能够作以下判断就能知道设备是iPad仍是iPhone.
  1. if ([UIDevice currentDevice].model rangeOfString:@"iPad"].location != NSNotFound) { 
  2.     NSLog(@"This is an iPad!"); 
2. 用UI_USER_INTERFACE_IDIOM()方法,这是系统定义的一条宏。使用方法也很简单。
  1. if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
  2.     NSLog(@"This is an iPad!"); 
摘自: http://blog.sina.com.cn/s/blog_3f88614f0100sdcm.html

九.并发编程
     1-GCD-Grand Central Dispatch,GCD使用队列来管理多个任务,而每一个任务是 以块(其定义相似于函数)来描述的。GCD从队列中读取这些要完成的任务,而后其多核执行 引擎负责将这些任务分配给它所管理的线程。和手动线程管理相比,GCD能极大地优化线程管理,并极大地减小建立和销毁线程所带来的额外开销。除了在多核系 统上得性能改进以外,GCD还能帮助提升应用的响应速度,并让代码更为干净,易于维护。
     2-NSOperationQueue-操做队列,能够极大地减小开发者在并发编程中的负担,而且操做队列有一套Objective-C的API,使用起来方便。
    基本操做单位-NSOperation,操做。
    操做是封装了一个与任务有关的代码与数据的抽象类,须要继承NSOperation,而且描述相关的任务。操做对象是一次性的,它只能执行一次,下一次,须要建立一个新的实例。
    能够经过addDependency:方法为操做添加相互依赖性。假设操做A依赖于操做B,若是操做B没有结束,操做A就不会开始执行。完成是指 执行完,或者取消了操做。有时须要对操做是否成功做出判断。经过removeDependency:方法来移除操做的相互依赖性。
    操做的一个属性是isConcurrent。当使用操做队列来管理这些操做时,isConcurrent应当设置为NO,这时应当重载 NSOperation的main函数(在类中保存controller对象-weak,并在main中调用controller的方法)。 isReady属性用于描述操做是否已经能够开始执行,isExecuting属性表示操做是否正在执行当中,isFinished属性表示操做是否顺利 完成,isCancelled属性则表示操做已经取消。
    能够在操做运行中取消它的运行,只须要给它发送cancel消息便可。在继承NSOperation类时,也须要支持cancel方法。
    若是只须要简单的操做,不想继承NSOperation类,可使用NSInvocationOperation类,这个类中的-initWithTarget:selector:object:方法能帮助你方便地选择人物的对象和相应的功能。
    操做的执行顺序取决于各自的优先级和相互之间的依赖性。
    操做队列有两种方式来执行其中的操做。第一种是开辟新线程来运行这些操做,第二种则是经过GCD来运行这些操做。可是不管如何,都不须要手动管理 线程。尽可能使用操做队列,只有在操做队列的效率明显不足时才转向GCD。由于操做队列是封装在GCD的基础之上的,虽然增长了一些额外开销,可是也具备更 加完善的功能。例子是TestNSOperation。
                           下页内容更加精彩实用

十.忙碌指示器
    UIActivityIndicator。
  1. UIActivityIndicatorView *activityIndicatior = [UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge]; 
  2.     activityIndicator.center = CGPointMake(512, 384); 
  3.     [self.view addSubview: activityIndicator]; 
  4.     [activityIndicator startAnimating];  
  5.     [activityIndicator stopAnimating]; 
  6.     [activityIndicator removeFromSuperView]; 
十一.媒体播放

1- 音频
     [1] 音乐每每是存储在iPod曲库(注意位置)中的,能够经过媒体选择器(media picker)或者媒体查询(media query)读取,而后用音乐播放器MPMusicPlayerController播放。
  1. MPMusicPlayerController *musicPlayer = [MPMusicPlayerController applicationMusicPlayer]; 
  2. [musicPlayer setShufleMode: MPMusicShuffleModeSongs]; 
  3. [musicPlayer setRepeatMode: MPMusicRepeatModeAll]; 
  4. [musicPlayer setQueueWithQuery: [MPMediaQuery songsQuery]; 
  5. [musicPlayer play]; 
    applicationMusicPlayer返回的播放器,在你的应用中播放音乐。它不会影响到iPod播放器,也不能从iPod播放器重获取信息。
    iPodMusicPlayer返回的是iPod播放器,在你推出应用后,全部的设置都会影响到以后设备上的iPod播放器。
    得到音乐播放器后,须要为它设置一个播放队列。能够用setQueueWithQuery:放方法,经过媒体查询MPMediaQuery来设置 播放队列,也能够用setQueueWithItemCollection:方法,经过MPMdiaItemCollection来设置播放队列。
    重复模式repeatMode能够设置为不重复、重复当前曲目、或整个播放列表;乱序播放shuffleMode能够设置为不乱序、乱序播放曲目或乱序播放专辑;音量volume的设置与音频播放器同样。
    skipToNextItem跳到下一首,skipToPreviousItem跳到上一首,skipToBegin跳到第一首。
    对应的宏都是以MPMusic开头。
     [2] 利用系统声音服务来播放短暂音效(时长30秒之内),并震动:   
  1. AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);  
    播放指定音效:
  1. NSURL *fileURL = [NSURL fileURLWithPath: path isDirectory: NO];  
  2. // 建立音效ID 
  3. SystemSoundID soundID; 
  4. AudioServiceCreateSystemSoundID((CFURLRef) fileURL, &soundID); 
  5. // 播放声音 
  6. AudioServicesPlaySystemSound(soundID); 
     [3] 音频播放器
    没有时长限制
  1. NSURL *fileURL = [NSURL fileURLWithPath: path isDirectory: NO]; 
  2. // 用URL来初始化音频播放器-播放的不是iPod曲库中的音乐 
  3. AVAudioPlayer* player = [AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: NO]; 
  4. // 准备播放 
  5. [player prepareToPlay]; 
  6. // 设置代理 
  7. [player setDelegate: self]; 
    方法:play、pause、stop。能够经过playing属性查询播放器是否正在播放当中,能够经过volume属性来修改和查询播放器的播放增益(从0.0到1.0),可经过setting属性查询播放器其余设置。

    duration表示音频的时间长度, currentTime表示当前播放到的时间。播放结束后能够经过代理方法audioPlayerDidFinishPlaying:来处理播放后设置。
2- 视频
    视频播放能够采用网页视图(UIWebView)进行嵌入式播放(能播放YouTube视频),或者采用电影播放器(MPMoviePlayerController)进行播放。
     [1] 电影播放器
  1. MPMoviePlayerController *player = [MPMoviePlayerController alloc]initWithContentURL: url]; 
  2.     // 设置播放器的大小,并将其加入视图中 
  3.     [player.view setFrame: rectFrame]; 
  4.     [self.view addSubView: player.view]; 
  5.     播放器的背景视图backgroundView。 
  6.     全屏[player setFullscreen: YES animated: YES]; 
  7.     播放另外一个影片[player setContentURL: newURL]; 
  8.     [player requestThumbnailImagesAtTimes:arrayTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; // 表示播放器不会在你所指定的时间去截取预览,而是在绝对时间的附近几帧中寻找效果最好的帧作为预览。 

scalingMode规定了影片的缩放模式。   数组

initialPlaybackTime用来控制视频开始播放的时间,单位是秒。安全

若是视频源在网络上,那么须要正确设置服务器端的mimeType。
十二.运行环-runloop
    运行环做用于一个iOS应用的整个生命周期。它负责监视各类输入事件,而且在合适的时候对这些输入进行分配。应用的每个线程都有且仅有一个运行环。你本身不须要建立也不须要销毁运行环,可是能够经过currentRunLoop方法来获取当前的运行环。

十三.定时器
    因为运行环机制,定时器的精度不高,只能用于通常性延时。
    例子:拼图游戏,DeskViewController.m。
    NSObject类的定时方法。
    performSelector: withObject: afterDelay: 运行方法,参数,时间(秒)。
    performSelectorOnMainThread: withObject: waitUntilDone: 在主线程中,运行参数selector所指定的方法,若是waitUntilDone参数为YES,那么当前线程会被阻拦,直到selector运行完。
    performSelector: onThread: withObject: waitUntilDone:同上,但不必定在主线程中运行。
    performSelectorInBackground: withObject: 开启一个新线程,用于运行selector方法,selector方法应负责线程的初始化。
    cancelPreviousPerformRequestsWithTarget:取消与一个目标相关的全部计划好的动做。
    cancelPreviousPerformRequestsWithTraget: selector: object只取消特定的计划动做。
十四.随机数
0~1之间随机数
  1. CG_INLINE float genRandomNum() 
  2.     return (float)arc4random/ARCRANDOM_MAX; 
十五.加速度传感器
    得到加速度传感器读数:
  1. UIAccelerometer *accelerometer = [UIAccelerometer shareAccelerometer]; // 单例 
  2. accelerometer.delegate = self; 
  3. accelerometer.updateInterval = 1.0f / 10.0f; // 传感器更新频率,普通游戏10~30HZ,虚拟现实类游戏,30~60HZ 
  4. accelerometer.x, accelerometer.y, accelerometer.z // 传感器读数 
    若不想再接受传感器读数,可将代理设置为nil
  1. [UIAccelerometer shareAccelerometer].delegate = nil;  
  2.  
  3. #define alpha 0.05 
  4. // 得到重力引发的加速度读数: 
  5. - (void)accelerometer: (UIAccelerometer *)accelerometer didAccelerate: (UIAcceleration *)acceleration 
  6.     // 简单低通滤波器 
  7.     accelX = (acceleration.x * alpha) + (accelX) * (1.0 - alpha); 
  8.     accelY = (acceleration.y * alpha) + (accelY) * (1.0 - alpha); 
  9.     accelZ = (acceleration.z * alpha) + (accelZ) * (1.0 - alpha); 
  10.      
  11. // 得到动做引发的加速度读数: 
  12. - (void)accelerometer: (UIAccelerometer *)accelerometer didAccelerate: (UIAcceleration *)acceleration 
  13.     // 减去低通滤波输出,获得高通滤波输出 
  14.     accelX = acceleration.x - ((acceleration.x * alpha) + (accelX) * (1.0 - alpha)); 
  15.     accelY = acceleration.y - ((acceleration.y * alpha) + (accelY) * (1.0 - alpha)); 
  16.     accelZ = acceleration.z - ((acceleration.z * alpha) + (accelZ) * (1.0 - alpha)); 
十六.地图与链接服务器
[1] 添加框架MapKit.framework。使用MKMapView来呈现地图。注意应当直接使用此类,而不是继承之。若是但愿在MKMapView类之上添加功能,可使用MKMapViewDelegate协议。
    初始化:
  1. MKMapView *mapView = [MKMapView alloc] initWithFrame: rect]; 
    初始化以后并不直接显示,还须要指定显示的地图区域:
  1. CLLocationCoordinate2D coordinate; 
  2. coordinate.latitude = latitudeValue; // 纬度 
  3. coordinate.longtitude = longtitudeValue; // 精度 
  4. mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, width, height); // 指定显示区域,width和height单位都是米 
    以后能够经过addSubview添加地图。
    属性:showsUserLocation-为YES,系统会持续跟踪用户的位置
          userLocationVisible-为YES,将显示用户所在位置
    显示地图以后,经常但愿在地图上添加标注,这须要建立一个类,并实现MKAnnotation协议,这个类叫作标注对象。标注对象每每实现 setCoordinate:方法来设置其坐标。在地图视图上,能够设置标注对象的坐标,而后添加进去,这样地图上就会出现一个标注。代理方法title 和subtitle可以在标注上显示标题和副标题。  
  1. // 初始化 
  2.    mapView = [MKMapView alloc] initWithFrame: CGRectMake(100, 100, 550, 700)]; 
  3.    mapView.showsUserLocation = TRUE; 
  4.    mapView.mapType = MKMapTypeStandard; 
  5.    mapView.delegate = self; 
  6.    // 设置坐标 
  7.    CLLocationCoordinate2D coordinate; 
  8.    coordinate.latitude = 37.31; 
  9.    coordinate.longtitude = -122.03; 
  10.    mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 4000, 6000); // 4000米宽,6000米高的区域 
  11.    [self.view insertSubview: mapView atIndex: 0]; 
十七.经过storyboard来初始化一个controller
  1. CBigDesignImageViewController *imageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"BigImageController"];  
   BigImageController是要在storyboard中设置的Identifier属性。

十八.给UIView子类设置阴影,包括各类控件
     1 导入QuartzCore framework
     2 #import <QuartzCore/QuartzCore.h>
     3 编码:
  1. [imgView layer] setShadowOffset:CGSizeMake(5, 5)]; // 阴影的范围  
  2. [imgView layer] setShadowRadius:2]; // 阴影扩散的范围控制  
  3. [imgView layer] setShadowOpacity:1]; // 阴影透明度  
  4. [imgView layer] setShadowColor:[UIColor brownColor].CGColor]; // 阴影的颜色 
十九.设置UIScrollView滚动速度      
  1. // 自动滚动太快,效果很差,这里把动画设置慢点,注意下面要直接赋值contentOffset,不要用带animated参数的函数,不然动画会出问题,由于两处都是动画效果。 
  2.         [UIScrollView animateWithDuration:1.0f  
  3.                                delay:0  
  4.                                options:UIViewAnimationCurveLinear 
  5.                                animations:^{ 
  6.                                    scrollView.contentOffset = CGPointMake(0, 0);  
  7.                                } 
  8.                                completion:^(BOOL finished){} 
  9.                                ];  
  10.         // 若是在减速滚动过程当中,按了刷新按钮,执行上面的动画,会出现重置的位置,y不是0的状况,这里再调用一次,滚动到0。 
  11.         [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];  
二十.EXC_BAD_ACCESS
Here’s the advice I generally give to developers when you hit an EXC_BAD_ACCESS error:
-Set the NSZombieEnabled argument in your executable options, which sometimes helps narrow down the cause
-Run with Apple Instruments such as Leaks to look for memory issues
-Set a breakpoint in your code and step through until you narrow down where it’s crashing
Tried and true “comment out code till it works” then backtrack from there :]

Xcode4 下设置 NSZombieEnabled 的方法: 
你能够点击 Xcode4 菜单 Product -> Edit Scheme -> Arguments, 而后将点击”加号”, 将 NSZombieEnabled 参数加到 Environment Variables 窗口中, 后面的数值写上 ”YES”.
或者在 Xcode4 菜单 Product -> Edit Scheme -> Diagnostics 设置窗口中直接勾上 Enable Zombie Objects 便可,Xcode 可用 cmd+shift+< 进到这个窗口。 
Xcode4 已经考虑到了如今的要求,因此提供了更便捷的设置的方式,你也能够在这个窗口中设置其余一些参数,你确定能由此得到更多的帮助信息。
 
好了,看完这篇iOS学习笔记整理,不知道对你是否是有所启发。
相关文章
相关标签/搜索