/ios_study_note

Studying IOS development skill notes

iOS Skill

目标

  • Objective-C
    • 基本语法
    • 面向对象
    • 内存管理
    • Category、Protocol、Block
    • Copy、KVC/KVO
    • Foundation框架
  • Swift 3.0 语言基础
  • iOS
    • iOS控件使用
      • StoryBoard/Xib文件/纯代码方式
      • UIButton/UILabel/UITable/UINavigator/UIImageView
    • 多线程编程
      • pThread
      • NSThread
      • NSOperation
      • GCD
    • 网络编程
      • NSURLConnection
      • NSURLSession
      • AFNetworking
      • CFNetwork
    • 文件操作
      • NSString读写文件
      • NSFileManager
    • 数据库操作
    • ViewController之间的数据传递
    • QuartzCore框架
    • 自定义View
    • iOS多媒体
    • iOS系统服务
    • iOS App之间数据传递
      • UIDocumentInteractionController
      • UIActivityViewController
      • Shared Keychain Access
      • Custom URL Scheme
      • Web Service
      • iCloud API
      • UIPasteboard

笔记

Objective-C

  • 头文件/实现文件(.h/.m)
  • +/-方法(类方法——静态方法/普通方法——对象方法声明)
  • @"string":OC字符串——NSString
  • goto:高级跳转语句[慎用]
int i = 0;
print: {
	i++;
	NSLog(@"i 的值为%d",i);
}	
if (i < 5) goto print;
  • switch条件只能放置数值类型或者字符类型不能放字符串Java 7能放置
  • 实例化对象
// [ 类名/对象名 方法名]
// alloc —— 为对象分配内存空间
// init —— 进行初始化
People *p1 = [[People alloc] init];
  • 类成员变量和属性
// .h 文件进行相关定义
@interface People : NSObject
{
	// 成员变量,给类内使用
	@public // 公有属性需要通过 -> 操作才能调用
	NSString * _peopleName;
	int _peopleAge;
	int _peopleSex; 
}
// 属性名,给类外使用,需要在.m 文件通过@synthesize进行与成员变量的关联
@property(nonatomic,strong)NSString * peopleName; //可以直接通过 . 操作进行调用
// 通过方法进行调用,需要在.m文件提供具体实现。调用方式[p1 setName:@"xxx"]
- (void) setName:(NSString *) name;
- (NSString *) getName; 
- (int) showWith:(int) first andSecond:(int) second;
@end
  • 初始化方法
// id 类似于Java范型,可以为任何类型
-(id) init;
// 方法的重写
-(instancetype) init;

自定义初始化方法

// .h文件
-(instancetype)init;
-(instancetype)initWithPeopleName:(NSString *) peopleName andPeopleAge:(int) peopleAge;

// .m文件
-(instancetype) init{
	self = [super init];
	if (self){
		_peopleName = "Visitor";
		_peopleAge = 30;
	}
	return self;
}
-(instancetype) initWithPeopleName:(NSString *) name andPeopleAge:(int) age {
	self = [super init];
	if (self){
		_peopleName = name;
		_peopleAge = age;
	}
	return self;
}
  • OC方法没有访问修饰符,如果父类中的方法没有在.h文件中写声明则子类不能集成该方法
  • OC没有多继承,protocol与Java 接口类似
// 实现协议方式
@protocol Printable <NSObject> // 协议继承别的协议
@optional // 一个类implements该协议时,可以不实现此方法
	- (void) print:(NSString *) str;
@end 

// 协议的实现
@interface class MyClass : NSObject<Printable,Drawable>
@end
  • OC的多态
    • 继承
    • 方法重写
    • Protocol
  • Catrgory(分类):给一个已经存在的类增加方法,而不用去改变它的源码
// .h 文件 NSObject+Json.h:给NSOject类增加toJson方法
@interface NSObject (Json)
	-(NSString *)toJson;
@end

// .m 文件
@implementation NSObject (Json)
	- (NSString) toJson{
		// ...
	}
@end
  • 内存管理:系统不会自动释放堆中的内存

    • 引用计数器:在Objective-C中每个对象内部都有一个与之对应的整数,叫做“引用计数器”。当一个对象在创建之后它的引用计数器为1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加1,当调用这个对象的release方法之后它的引用计数器减1。如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象
    • 属性参数:@property——快速实现getter、setter方法
      • MRC默认参数:(atomic,readwrite,assign)
      • ARC默认参数:基本数据默认属性参数:(atomic,readwrite,assign),对象类型默认属性参数:(atomic,readwrite,strong) img
    • 自动释放池:@autoreleasepool
      • autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中
      • 自动释放池实质是当自动释放池销毁后调用对象的release方法(不能保证一定将该对象释放)
      • 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存,最好不要放倒自动释放池或者考虑放到多个自动释放池
      • Objective-C中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法
    • 内存释放原则:谁创建,谁释放
  • 野指针:指向一个被释放对象的指针变量[需要将该变量设置为nil]

    • 表现为:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误
  • 内存管理的两种方式

    • MRC(手动引用计数):
      • assign:用于基本数据类型
      • retain:用于非字符串对象
      • copy:用于字符串对象、block、NSArray、NSDictionary
    • ARC(自动引用计数):
      • strong:会引起引用计数加1.是指针拷贝(浅拷贝),不会拷贝内容
      • weak:当所指对象被销毁时,指针会自动被设置为nil,防止野指针
      • copy:先copy一个相同对象。再创建一个strong指针。(深拷贝,会拷贝内容)
      • unsafe_unretained:(不安全引用)用于基本数据类型
  • #pragma mark -:以#pragma开头的代码是一条编译器指令。是一个特定于程序或编译器的指令。该指令告诉Xcode编译器,要在编辑窗格顶部的方法和函数弹出菜单中将代码分隔开

  • Block:也是一种类型

    • 类型定义:返回值类型(^ 变量名)(参数列表)
    • typedef定义:返回值类型(^ 变量名)(参数列表)
    • 实现:^(参数列表){操作主体}
    • Block中可以读取块外面定义的变量但是不能修改,如果要修改这个变量则必须声明_block修饰
  • 定义宏:#define PI 3.1415926 [Java全局变量]

  • Objective-C动态机制

    • KVC(键值编码):不进行任何操作就可以进行属性的动态读写(由NSKeyValueCoding协议提供,NSObject实现了该协议)
      • 动态设置:setValue:属性值 forKey:属性名——用于简单路径、setValue:属性值 forKeyPath:属性路径——用于复合路径(对象里面的对象
      • 动态读取 :valueForKey:属性名valueForKeyPath:属性名——用于复合路径
    • KVO(键值监听):一种观察者模式,用于实现视图组件和数据模型的分离(由NSKeyValueObServing协议提供,NSObject已经实现了该协议)
      • 使用方式
        • 通过addObserver: forKeyPath: options: context:注册监听器
        • 重写监听器的observerValueForKeyPath: ofObject: change: context:方法
      • 常用操作
        • 注册指定Key路径的监听器:addObserver: forKeyPath: options: context:
        • 删除指定Key路径的监听器:removeObserver: forKeyPathremoveObserver: forKeyPath: context:
        • 回调监听 :observeValueForKeyPath: ofObject: change: context:
  • Copy

    • copy/retain区别
      • copy:创建一个新对象
        • copy:遵守NSCopying协议的类才可以发送copy消息[只有NSString到NSString的拷贝是浅拷贝,其他的都是深拷贝]
        • mutableCopy:守NSMutableCopying协议的类才可以发送mutableCopy消息[深拷贝]
      • retain:创建一个指针,引用对象计数加一[浅拷贝]
  • 文件操作:在Objective-C中路径、文件读写等操作是利用字符串来完成的

// 读取文件
NSString *path = @"/Users/Stokey/Desktop/test.txt";
NSString *outInfo =  [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];  

// 写入文件
NSError * error;
NSString *inputInfo =@"hello objective-c";
[inputInfo writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
	NSLog(@"write file fail, the error is %@", [error localizedDescription]);
} else {
	NSLog(@"write file success !");
}
  • NSArray

    • NSArray中只能存放对象,不能存放基本数据类型,通常通过在基本数据类型前加@进行转换
    • 数组中的元素后面必须加nil以表示数据结束
    • makeObjectsPerformSelector执行数组中对象的方法,其参数最多只能有一个
  • 多线程

    • pThread:基于C语言框架,不常用
      • pthread_create
    • NSThread
      • 创建线程
        • [[NSThread alloc] initWithTarget: selector: object:]
        • [NSThread detachNewThreadSelector: toTarget: withObject:]
        • [self performSelectorInBackground: withObject:]
      • 线程同步
        • @synchronized(self){}
        • [NSCondition lock] / [NSCondition unlock]
    • GCD
      • 创建线程

        • dispath_async(dispatch_queue_t , ^{})
        • dispath_async(dispatch_get_main_queue(), ^{})//主线程
        • dispatch_async(dispatch_get_global_queue(),^{})//创建子线程
      • 创建线程任务队列

        • 创建并发线程队列
         dispatch_queue_t queue = dispatch_queue_create("key.queue", DISPATCH_QUEUE_CONCURRENT );
         dispatch_async(queue, ^{}) ;//或创建多个线程,线程并发执行 
        • 创建线程任务队列
         dispatch_queue_t queue = dispatch_queue_create("key.queue", DISPATCH_QUEUE_SERIAL);
         dispatch_async(queue, ^{}) ;//只创建一个线程,但是改线程当中有多个任务 
       
       + dispatch_group
       	+  dispatch_group_async
       	+  dispatch_group_enter/dispatch_group_leave
       + 单例模式:`dispath_once(dispatch_once_t,^{})`
       + 延迟执行:`dispatch_after(dispatch_time(DISPATCH_TIME_NOW),(int64_t)(2*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{})`  
          
      
    • NSOperation
      • NSOperationQueue:线程池,用于管理NSOperation
        • addOperation
        • setMaxConcurrentOperationCount
      • 状态
        • ready
        • cancelled
        • executing
        • finisshed
        • asynchronous
      • 依赖:addDependency
      • 具体实现
        • NSInvocationOperation/NSBlockOperation:同步方法
        • NSOperationQueue:异步方法
  • frame/bounds区别

    • frame:相对于父视图中的坐标位置和大小
    • bounds:相对于View本身的坐标系统
    • center:相对于父视图中的位置和大小
  • ViewController之间的数据传递

    • A -> B (父视图——>子视图)
      • 在Storyboard上面连接视图控制器A和控制器B,点击连线。在属性设置窗口设置segueidentifier——MainToCheck

      • 在 B ViewController的.h文件中定义属性 _showArray用于接收属性

        @property (string,nonatomic) NSArray *showArray;
      • 在 A ViewController.m文件中设置-(void) prepareForSegue:(UIStoryboardSegue *) segue sender:(id) sender方法

        -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{  
        	if ([[segue identifier] isEqualToString:@"MainToCheck"]) {  
        		CheckViewController *CheckVC = [segue destinationViewController];  
        		CheckVC.showArray = [[NSArray alloc] initWithArray:_currentArray];  
        	}  
        }  
    • B -> A (子视图——>父视图):让A成为B的代理,在B中调用A的代理方法,通过代理方法的参数传递数据给A
      • 在B .h文件中添加协议(#import和#interface之间),并添加delegate属性

         @class LoadViewController;
         @protocol CheckViewDelegate <NSObject>
         -(void) LoadDataViewController:(CheckViewController *) controller didFinishLoadData:(NSMutableArray *) loadedArray; 
         @property (nonatomic, weak) id <LoadViewDelegate> delegate;
         @end
      • 在B ViewController.m中调用代理方法,将数据通过代理方法传递给其代理

         [self.delegate LoadDataViewController: self didFinishLoadData: testArray];
      • 在A ViewController.m文件中实现B的代理方法

         -(void)LoadDataViewController:(CheckViewController *)controller didFinishLoadData:(NSMutableArray *)loadedArray{  
         	self.currentArray = loadedArray;  
         }  

Swift

iOS

系统结构:

img

  • Cocoa Touch:基于iPhone OS应用层直接调用层,如触摸事件、相机管理等

    • UIKit img
    • MapKit
    • Multi-Touch Events
    • Core Motion
    • Camera
    • View Hierarchy
    • Localization
    • Alerts
    • Web Views
    • Image Picker
    • Multi-Touch Controls
  • Media:该层框架和服务依赖Core Services层,向Cocoa Touch层提供画图和多媒体服务,如声音、图片、视频等

    • Core Audio
    • OpenGL
    • Audio Mixing
    • Audio Recording
    • Video Playback
    • JPG/PNG/TIFF/PDF
    • Quartz
    • Core Animation
    • OpenGL ES
  • Core Services:提供核心服务,如字符串处理函数、集合管理、网络管理、URL处理工具、联系人维护、偏好设置等

    • Core Foundation
    • Foundation
    • CloudKit
    • HealthKit
    • HomeKit
    • Collections
    • Address Book
    • Networking
    • File Access
    • SQLite
    • Core Location
    • Net Services
    • Threading
    • Perferences
    • URL Utilities
  • Core OS:最底层核心操作系统层

    • 框架
      • Accelerate 加速框架
      • Core Bluetooth Framework(核心蓝牙框架)
      • External Accessory Framework(外部附件框架)
      • Generic Security Services Framework(通用安全服务框架)
      • Security Framework(安全框架)
      • System
      • 64-Bit Support
    • 组件
      • OS X Kernel
      • Mach 3.0
      • BSD
      • Sockets
      • Power Mgmt
      • File System
      • Keychain
      • Certificates
      • Security
      • Bonjour