[不断更新]iOS开发常用技术
1.修改默认初始化方法 构建便利构造器
修改默认init初始化
.m文件中
@implementation 类名
-(id)init{
self=[super init];
printf("xxx");
if(self){
name=@"xxx";
age=;
xx=xxx;
}
return self;
}
}
@end
main中
@autoreleasepool{
xxx* xx=[[xx alloc]init(默认方式)];
} 根据名字(可使用多条件)初始化
.m文件中
-(id)initName:(NSString)n{
self=[super init];
if(self){
name=@"xxx";
age=;
xx=xxx;
}
return self;
}
}
@end
main中
@autoreleasepool{
xxx* xx=[[xx alloc]initName];
}
2.重写系统description方法 用于测试
#pragma mark 描述 NSLog(@"%@",对象名);
-(NSString*)description{
return [NSString stringWithFormat:@"uid=%d",[self getUid]];
}
3. NSString相关操作
NSString不可变字符串/NSMutableString可变字符串
创建字符串
.字面量 NSString* str=@"xxx"; 常用
.new NSString* str=[NSString new]; 不推荐
.实例化 NSString* str=[[NSString alloc]initWithString:@"xxx"]; 常用
.便利构造器 NSString* str=[NSString stringWithFormat:@"格式",变量]; 重点
文件 a01.jpg...a20.jpg
for(i=;i<=;i++)
NSString* str=[NSString stringWithFormat:@"a%02d",i];
.通过字符数组初始化
char c[]=@"xxx";
NSString* str=[[NSString alloc]initWithCString:c encoding:UTF8String]; NSString常用消息
获取字符串长度
NSInteger length=[str length]; 根据索引得到单个字符
unichar c=[str charactorAtIndex:]; //索引从0开始 从某个位置截取字符串(获得子串)
NSRange range={,}; //1为索引位置 2为截取长度
NSString* str=[str subStringWithRange:range];
eg.
NSString* str=@"helloworld";
NSRange r={,};
NSString* result=[str subStringWithRange:r];
NSLog(@"%@",result);
-> ell //取.jpg前的值
NSRange range;
NSString* demo=@"xxx.jpg";
range=[demo rangeOfString:@"."];
if(range.length==){
printf("Nothing Match!\n");
}
NSRange find={,range.location};
NSString* result=[demo subStringWithRange:find];
NSLog(@"%@",result); 叠加字符串 appendString(NSMutableString适用)
NSMutableString* str=[[NSMutableString alloc]init];
[str appendString:@""];
[str appendString:@""];
NSLog(@"%@",str);
->
4.NSArray相关操作
NSArray数组遍历
.循环法
for(int i= ; i<str.count ; i++)
{
NSLog(@"%@",str[i]);
}
.迭代器(OC中专门遍历数组的方法 效率更高)
NSEnumerator* it=[str objectEnumerator];
id object;
while(object=[it nextObject])
{
NSLog(@"%@",object);
} 使用字面量输入数据
NSArray* array=@[stu1,stu2,@"xxx"]; 输出数组元素个数
NSLog(@"count=%ld",array.count); 输出数组所有元素
NSLog(@"%@",array); 取得数组第4个元素
NSLog(@"4th%@",[array objectAtIndex:]); NSMutableArray*
为可变数组根据所占空间实例化
NSMutableArray* muArray=[NSMutableArray arrayWithCapacity:]; 为可变数组添加数据
[muArray addObject:@"xxx"]; 根据索引为可变数组插入/删除数据
[muArray insert/removeObject:@"xxx" atIndex:]; 遍历可变数组
for(NSObject* object in muArray){
NSLog(@"%@",object);
}
5.NSDictionary相关操作
创建NSDictionary
NSDictionary* dic=[NSDictionary dictionaryWithObjectsAndKeys:@"object1",@"key1",nil]; //字典必须以nil结尾 以文件内容初始化字典
NSDictionary* dic=[NSDictionary dictionaryWithContentsOfFile:path]; 通过字面量创建字典
NSDictionary* dic=@{@"k01":@"xxx",@"k02":@()}; //数字直接用@( )放入字典 输出字典内容
NSLog(@"%@",dic); 取得字典长度
[dic count]; 通过键输出字典内容
NSLog(@"%@",[dic objectForKey:@'k01"]);
NSLog(@"%@",dic[@"k01"]); 遍历字典(只取得value或key)
NSEnumerator* it=[dic object/keyEnumertor];
id object;
while(object=[it nextObject])
{
NSLog(@"%@",object);
} 取得所有的键
NSArray* array=[dic allKeys]; NSMutableDictionary*
创建并初始化
NSMutableDictionary* dic=[NSMutableDictionary dictionaryWithCapacity:]; 向字典动态添加数据
[dic setObject:@"xxx" forKey:@"xxx"];
6.KVC键值编码
KVC Key-Value-Coding
间接访问实例变量的方法
Student* stu=[[Student alloc]init];
[stu setValue:@"xxx" forKey:@"name"];
NSString* name=[stu valueForKey:@"name"];
NSLog(@"学生姓名=%@",name);
7.NSDate相关操作
获取当前时间
NSDate* now=[NSDate date];
NSLog(@"%@",now); 取得两个时间对象间隔
NSDate* now=[NSDate date];
NSDate* tomorrow=[[NSDate alloc]initWithTimeIntervalSinceNow:**];
NSLog(@"%@",[now timeIntervalSinceDate:tomorrow]);
8.Protocol协议实现方法
protocol 协议
协议只能放方法的声明 创建协议
New->File->Objective-C->Protocol
Protocol.h文件
@protocol 协议名<NSObject(父协议)>
@required (必须实现)
@optional (可选)
@end 使用协议
.h文件中 #improt"ProtocolName.h" 父类名后加<ProtocolName>
.m文件中 实现协议功能 判断方法是否实现
测试协议时使用
if [对象 respondsToSelector:@Selector(方法名)]{
[对象 方法名];
};
OC中方法是SEL(@Selector)类
9.Delegate委托代理
delegate 委托代理
类自己不能完成的消息 让别的类去做
实际应用时 区分委托代理是谁 谁需要帮助 谁需要遵守协议 创建委托代理模式
.创建协议 声明能帮助其它类的消息
.需要帮助的类
->NeedHelp.h中
#import"ProtocolName.h"
父类名后不要加<ProtocolName>//只导入协议 不遵守协议
->声明delegate属性
@property(nonatomic,assign)id<ProtocolName>delegate
->NeedHelp.m中
->需要帮助的消息中写
if(self.delegate&&[self.delegate respondsToSelector:@selector(帮助该类的消息)])
{
[self.delegate 帮助该类的消息];
};
else ...
.委托代理的类
->Helper.h中
#import"ProtocolName.h"父类名后加<ProtocolName>
->Helperm中
实现协议中声明的功能
.实例化对象
NeedHelp类的对象.delegate=委托代理类的对象;
10.NSTimer相关操作
NSTimer
{
int count;
NSTimer* TimeStop;
}
-(id)init
{
self=[super init];
count=;
[NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(doHomework) userInfo:nil repeats:YES];
if(count==)
[TimeStop invalidate];
return self;
}
-(void)doHomeWork
{
count++;
printf("HomeWork %d\n",count);
}
int main()
{
Student* stu=[[Student alloc]init];
[stu doHomeWork];
[[NSRunLoop currentRunLoop]run];
//单独的NSTimer类对象使用[timer fire];方法启动计时器
}
11.NSNotificationCenter通知中心
NSNotificationCenter 通知中心
实现了观察者模式 允许应用的不同对象以松耦合的方式进行通信 创建通知中心
.通知中心是系统中的单例
不用单独创建 直接使用即可
.设定观察者observer
在观察者observer.m中 需要设定观察的消息中写入
-(void)observer
{
NSNotificationCenter* nc=[NSNotificationCenter defaultCenter];
//SEL为观察者需要执行的代码 Name为通知中心根据这个名字进行通知观察者
[nc addObserver: self selector:@selector(SEL) name:@"Name" object:nil];
}
.设定发送者poster
在发送者poster.m中 需要设定发送的消息中写入
-(void)poster
{
NSNotificationCenter* nc=[NSNotificationCenter defaultCenter];
//Name为poster发送到通知中心的标记 object为发送消息的对象
[nc postNotificationName:@"Name" object:self];
}
.main中直接实例化观察者和发送者
先创建[观察者对象 observe];进行观察 再创建被观察者执行消息
12.单例模式
单例
类中的对象有且只有一个 单例方法命名
多以shared类名 或 default类名开头 .h文件
+(id)sharedClassName; .m文件
#import "ClassName.h"
@implementation
ClassName
Static ClassName* shared=nil;
+(id)sharedClassName{
static dispatch_once_t xx;
dispatch_once(&xx,^{
if(shared==nil){
shared=[[super allocWithZone:Null]init];
}
});
return shared;
}
-(id)copyWithZone:(NSZone*)zone
{
return self;
}
+(instancetype)allocWithZone:(NSZone*)zone
{
return [self sharedClassName];
}
@end
13.FMDB数据库操作
FMDB常用类
FMDatabase : 一个单一的SQLite数据库 用于执行SQL语句
FMResultSet :执行查询一个FMDatabase结果集 这个和android的Cursor类似
FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类 建立FMDB
.把FMDB文件夹复制到项目根目录
.把FMDB文件拖入项目
.project-> BuildPhases-> LinkBinaryWithLibraries-> +Libsqlite3.dylib 使用FMDB
.导入头文件
#import"FMDatabase.h"
.建立数据库
NSString* path=@"xx/xx/xx.db"; //xx/xx/xx为建立数据库路径 可以把路径定义成宏 方便更改
FMDatabase* db=[FMdatabase databaseWithPath:path]; //参数为上面定义的path
* 当数据库文件不存在时 fmdb会自己创建一个
* 如果传入的参数是空串:@"" 则fmdb会在临时文件目录下创建这个数据库 数据库断开连接时 数据库文件被删除
* 如果传入的参数是 NULL 则它会建立一个在内存中的数据库 数据库断开连接时 数据库文件被删除
if(![db open]){
printf("Error!\n"); //如果没有打开数据库则显示Error
}
else{
printf("Success!\n");
}
[db close]; //建立后关闭数据库
.建表
NSString* sql=@"create table if not exists tablename(列名1,列名2);";
.数据库增删改等操作
除了查询操作 FMDB数据库操作都执行executeUpdate方法 这个方法返回BOOL型
NSString* sql...
.数据查询操作
查询操作使用了executeQuery 并涉及到FMResultSet
if ([db open]) {
NSString * sql = [NSString stringWithFormat:
@"SELECT * FROM %@",TABLENAME];
FMResultSet * rs = [db executeQuery:sql];
while ([rs next]) {
int Id = [rs intForColumn:ID];
NSString * name = [rs stringForColumn:NAME];
NSString * age = [rs stringForColumn:AGE];
NSString * address = [rs stringForColumn:ADDRESS];
NSLog(@"id = %d, name = %@, age = %@ address = %@", Id, name, age, address);
}
[db close];
}
14.通过Tag查找视图
通过tag查找视图
tag是UIView的属性
UIView* view1=[[UIView alloc]initWithFrame:CGRectMake:( , , , )];
view1.tag=;
[self.view addSubview:view1];
//通过tag使tag值为100的view背景变成黑色
[self.view viewWithTag:].backgorundColor=[UIColor blackColor];
15.动画代码块
动画代码块
.[UIView animationWithDuration:5.0
animations:^{
//code
}];
.[UIView animationWithDuration:5.0
animations:^{
//code
}
completion:^(BOOL finished){
//动画后执行的code
}];
.[UIView animationWithDuration:5.0
delay:2.0 //延时执行
options: //动画过度效果 枚举类型
animations:^{
//code
}
completion:^(BOOL finished){
//动画后执行的code
}];
16.NSUserDefaults明文存储
NSUserDefaults[明文]
//写入数据
NSUserDefaults* userDefaults=[NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"" forKey:@"password"];
[userDefaults synchronize]; //同步数据到磁盘 非必需
//读取数据
NSUserDefaults* userDefaults=[NSUserDefaults standardUserDefaults];
NSString* str=[userDefault stringForKey:@"password"];
NSLog(@"%s",str);
17.获取文件目录
App沙盒
每一个App自己使用的独立空间-沙盒
不能跨沙盒访问数据 沙盒的三个子目录
Document 存放长期文件
Library 系统存放文件
tmp 临时文件 App重启时该目录下文件清空 //获取根目录
NSString* homePath=NSHomeDirectory( ); //获取Documents文件夹目录
NSArry* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString* documentsPath=docPath[]; //获取Cache文件夹目录
NSArry* cacPath=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString* cachePath=cacPath[]; //获取Library文件夹目录
NSArry* libPath=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString* libraryPath=libPath[]; //获取tmp目录
NSString* tempPath=NSTemporaryDirectory( );
[不断更新]iOS开发常用技术的更多相关文章
- IOS开发常用技术网站
IOS常用网站: 1.http://www.cocoachina.com 2.http://oschina.net 3.http://code4app.com
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- iOS开发-常用第三方开源框架介绍
iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...
- iOS开发--常用技巧 (MJRefresh详解)
iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...
- IOS开发--常用工具类收集整理(Objective-C)(持续更新)
前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就 ...
- iOS开发常用国外网站清单
工欲善其事必先利其器,最近发现临时查找一些东西容易浪费时间,花了点时间整理一下常用的网站,方便以后备用. 国内的code4app,ui4app,cocoachina,oschina,csdn就不说了, ...
- iOS开发常用第三方库
UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...
- iOS 开发常用的调试工具
前言 最近博主临近毕业季,为了完美的写一篇毕业论文,真是:“锄禾日当午,汗滴禾下土”<—— 这句诗跟毕业我写毕业论文没任何一毛钱关系,我就是突然想吟湿了.不过博主作为网络工程专业的好青年,曾经的 ...
- iOS开发——高级技术&内购服务
内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通 ...
随机推荐
- IO流-----写到输出流
输出流:---链接:http://blog.csdn.net/du_minchao/article/details/49045421 /** * 方法名:writeStream * 方法描述:写到输出 ...
- blog (后续更新)
设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...
- cocoapods安装
什么是cocoapods CocoaPods是一个用来帮助我们管理第三方依赖库的工具.它可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我 ...
- Python 【第十章】 Django路由
路由可以简单理解就是 URL -> 函数名 例如: /login1/ -> 函数名 urls.py文件中 urlpatterns = [ # url(r'^admin/', admin.s ...
- Emeditor批量修改文件编码格式(UTF-8)
采用宏的形式进行,直接在Emeidor导入宏即可使用: emeditor导入宏:[宏]->[自定义]->[新建]->找到EncodingChange.jsee文件即可. 链接:htt ...
- The common Linux Commands
Linux的命令总结 1. man:在线请求系统帮助 例:man mkdir NAME:这个命令的完整全名 mk(make directories) SYNOPSIS:这个命令的基本语法 mkdir ...
- oracle--函数--bai
--1 没有入参的函数.返回字符串 create or replace function get_time return varchar2 as v_time varchar2(20); --声明1个 ...
- 记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)
目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: ProcessStartInfo psi = new ProcessStartInfo(); p ...
- 初识virtual memory
一.先谈几个重要的东西 virtual memory是一个抽象概念,书上的原文是"an abstraction of main memory known as virtual memory& ...
- ajax传输中文乱码解决方法
问题描述: 我是在一个jsp页面有一个保存按钮,点击时会触发saveForm()的js函数,在saveForm()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,aj ...