在这里给大家推荐一个 非常棒的 笔记软件 。pc端和app端都有 ======印象笔记
1 、全局变量,变量名前加下划线。和系统一致。
2 、 nil指针为空 @“”字符串为空 (内容为空)== 判断内存地址 基本变量
对于一些基本类型 可以使用==来判断,但对于指针类型,使用==则判断的是指针保存的内容地址是否相等,而不是判断内存地址下的内容是否相等(应该通过方法来判断)
多个指针可以这向同一个对象
3 、判断两个字符串是否相等用 isEqualToString:@“”
4、警告框
不需要设置fram
不需要addSubview
如果需要添加多个按钮,在最后一个参数中添加,用逗号隔开,以nil结尾
5 、RGBA 0.0~1.0 灰度(亮度值) 0 0 0 黑色 1 1 1白色
6 、control以及其子类都可以绑定方法
7、默认在图片上添加按钮,按钮是不能被点击的,是因为默认图片视图不可交互
imageView.userInteractionEnable = YES;设置可交互
父视图可交互 子视图是否可交互看子视图自己
父视图不可交互 子视图也不可交互
默认不可交互的 UILabel UIImageView
点击登陆视图上的注册按钮,先把登陆视图移出再添加注册视图
点击注册视图上的的返回按钮,先把注册视图移出再添加登陆视图
========================================
标题黑色23号字体
注释绿色20号字体
内容黑色20号字体
==========================
1 动画
// 1 开始动画 beginAnimations
[UIView beginAnimations:nil context:nil];
//3 设置动画时间 setAnimationDuration
[UIView setAnimationDuration:3];
[UIView
//设置翻转样式
setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.window cache:YES];
//设置重复自动反向运动
[UIView setAnimationRepeatAutoreverses:YES];
//4 终点坐标
_image.frame = CGRectMake(320-80, 480-80, 80, 80);
//2 提交动画 commitAnimations
[UIView commitAnimations];
2 成为第一响应 键盘自动弹出
[_textFiledYongHuMing becomeFirstResponder]; 成为第一响应
resignFirstResponder 释放第一响应
//键盘自动消失
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"touchesBegan");
[self.window endEditing:YES];
}
3 视图移除和添加
[_zhuCeView removeFromSuperview];
[self.window addSubview:_loginView];
==================
1 视图控制器类
UIViewController
单一控制视图,不在入口类中添加过多的代码(增加复杂性)
1 导入头文件
2 创建视图控制器对象
3 把对象赋值给self.window.rootViewController = aVi;
2 XIB文件
早期nib文件, .xib结尾
1 .File’s owner 文件所有者,就是指我们的视图控制器aViewController
2. First Responder 第一响应者
3.View 是视图控制器默认的view
self.view就是xib里的那个view
3 关联
1. xib上的控件与对象(指针关联)
1.1 关联按钮,绑定方法
点击Assistant editor按钮
1.2 右键xib中的控件,直接拖拽到.h文件的属性区域,松开,在弹出的的对话框中写入变量名,connect
1.3 注意,如果想要改变关联之后的变量名,必须删除原有的,连线也要切断,重新拖拽.
{
IBOutlet UITextField *_nameTF;
//IBOutlet 关键字,就是用来关联指针(.h)和控件(.xib)的
//Outlet 出口
//IB 前缀Interface Builder(接口建设者)
//IB 工具.早期的IB是与XCode分离的不利于开发,现在��到一起
}
按钮设置图片1 setimage 对应Custom类型 2 backgroudimage 对应system类型 二者区别
关联属性IBOutlet
关联方法IBAction
.h中 @property int age; 在.m里可以直接用_age;
如果在.m中创建和_age一样的局部变量,局部变量会覆盖全局变量
在.m中self.age == _age
关联属性可以将空间拖拽到大括号外(声明区域).如果在大括号外,会自动完成属性的描述,以后使用就可self.age或_age而直接拖拽到大括号中,默认只能使用_age(指针名);
4 知识点:在视图控制器中获取window对象。
在一个类中获取另一个类的window对象来承载view,需要在这个类中通过另一个的对象打点调用window
(导入头文件)
1 找window ZYAppDelegate *app = [UIApplication sharedApplication].delegate; 获取入口类 .delegate系统做这件事,代理
UIWindow *window = app.window;
2
UIWindow *window = [UIApplication sharedApplication].keyWindow
为什么要用window ?
在window上添加view
5 充分理解
window.rootViewController = vc
把vc赋给window的rootViewController,则默认会调用vc中的viewDidLoad方法(),像这样的只有把vc给rootViewController,运行程序才能在window上显示vc的view
6 把视图控制器的懒加载放置在动画执行下面
window.rootViewController = vc
这里把vc赋给window的rootViewController,则默认会调用vc中的viewDidLoad方法,像这样的只有把vc给rootViewController,运行程序才能在window上显示vc的view,而单纯的创建对象是不能显示,这种方法叫做懒加载(lazy load)
(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views —->当需要使用view时有回到第一步,如此循环。
7 为了防止在显示vc的view时,造成的界面错乱(如果把下面的代码放置在动画中,则vc的view的创建和显示整个过程都要执行动画),就将下面的代码放置在动画执行之hou
1 视图控制器的传值
A 1.1获取用户名
1.2创建一个字符串保存
1.3在vieDidLode中进行赋值
B 打点调用直接把源属性的值赋值给目的属性的值
c 通过初始化方法,先把用户名保存在一个字符串中,然后在初始化方法中,
1 创建对象的属性
2 初始化方法
2.1 创建对象时调用自己写的初始化方法进行初始化把文本框中的字符串传递到初始化方法中从而保存在一个设置好的属性中,然后在ViewDidLoad中把保存的值赋值给目标文本框.
在使用视图控制器直接传值时,传值的过程很简单,要么通过设置属性值,要么通过初始化方法来设置 . 但是因为有了界面的显示,要十分明确,只有控件显示之后再把传递过来的值赋给控件的属性加以显示.
2 常用控件
2.1 UISegmentedControl
2.1.1创建一个数组,里面添加你需要的对象(最后要加入到UISegmentedControl的选项)
2.1.2 设置按钮属性,并且绑定一个带参数的方法,参数传递的就是你所点击的按钮
2.1.3
3 三目运算符 { ++ — += 双目运算符 }
condition?value1:value2;
当condition为真,则结果为value1,否则结果为value2;
_label.test = isOn?@“开”@“关”
BOOL 0为假 非零为真
bool 只有0 和 1 两个值 0为假 1为真
==================
20140718
==================
1 !取反 !YES==NO 可用于判断
2 创建数组对象也可以直接用类方法搞定
==================
20140719
==================
1 让警告框自动消失
[alert dismissWithClickedButtonIndex:0 animated:YES];
2 为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
原因是有时我们对 button做一次点击,需要改变button的标题,只有用方法才能做到,而label是标签,只是用来展示内 容的,要想改变一般都是通过其他的控件,绑定方法来实现,不需要在lable上操作.
==================
20140721
==================
1 获取按钮标题
NSString*b = [buttonName titleForState:UIControlStateNormal];
//获取按钮标题 通过标题算出小红条宽度
NSString *str = btn.titleLabel.text;
2 判断字符串中是否包含某个字符
//判断字符串中是否存在某个字符串
NSString*aString = @"1223ll45";
//range 范围
//NSRange 结构体
//location 位置 length 长度;
NSRange range = [aString rangeOfString:@"l4"];
NSLog(@"============%d===========%d",range.location ,range.length);
//法 一
if (range.length==2)
{
NSLog(@"判断长度是否为2======不是判断是否存在,是通过长度(范围)判断");
}
//法 二
if (range.length == NSNotFound)
{
NSLog(@"通过location判断");
}
//封装 判断某个字符串中是否存在另一个字符串的方法
- (BOOL)string:(NSString*)bigString isContainString:(NSString*)smallString
{
// NSString range = []
NSRange range = [bigString rangeOfString:smallString];
if (range.length == NSNotFound)
{
return NO;
}
return YES;
}
3 字符串截取
NSString*aString = @"1223ll45";
//字符串截取
// NSString*str = [aString substringFromIndex:2];
//从某一处开始截取
NSLog(@">>>>>>>>>%@",[aString substringFromIndex:2]);
//截取到某一处
NSLog(@"---------%@",[aString substringToIndex:4]);
//截取某一部分 [aString rangeOfString:@"3l”]是NSRange类型 是一个结构体
NSLog(@">>>>>%@",[aString substringWithRange:[aString rangeOfString:@"3l"]]);
4 UIImage:NSObject
UIImageView :UIView
5 arc4random()真随机
random() 假随机
6 传参 (查)
1 按钮绑定一个带参数的方法sender
2 延时加载 withObject 传递一个对象
3 动画下落中的 context
4 定时器传参 userInfo
4.1 eg:[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(abc) userInfo:@“Lijian”(此处还可以填一个对象) repeats:YES];
-(void)abc
{
NSLog(@"====================%@",aTimer.userInfo);
}
7 动画不能写在viewDidLoad
//必须在执行viewDidLoad执行完毕之后才能执行动画 把动画塞给viewDidLoad不可取
//动画是一个过程,而过程是在有view的基础之上进行
8 动画结束方法
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
9 可以通过animationID来判断是哪个视图
if ([animationID isEqualToString:@"view1"])
==================
20140722
==================
1 频繁的 持续性的 用定时器
2 雪花下落
2.1 NStimer + 动画结束方法 定时器中频繁创建,在动画结束方法中频繁的移除,会造成大量磁盘碎片.
2.2 数组 重用
一次性创建30个图片,放在数组中,用的时候就可以去图片,从上方下落,当下落到屏幕外面,回收到数组中,以便下次使用
3 宏定义
//宏定义 变量别名 增加程序可读性 字母大写
#define UNSUED 1;//UNSUED指的就是1
#define SUED 2;
//程序中出现较多的常量,通过宏定义便于管理
宏定义和继承没有关系,一般写在.m中
4 自定义类
当原有类已经满足不了我们的要求时,我们可以通过 自定义类来完成属性和方法的扩展
5 跑马灯
5.1viewController + Animation
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3];
//设置重复自动反向运动
[UIView setAnimationRepeatAutoreverses:YES];
//设置重复次数
[UIView setAnimationRepeatCount:LONG_MAX];
_lable.frame = CGRectMake(320-50, _lable.frame.origin.y, 50, 22);
[UIView commitAnimations];
5.2自定义类+初始化方法
5.3自定义类+绘图方法
//绘图方法 整容方法
- (void)drawRect:(CGRect)rect
==================
20140723
==================
1 椭圆运动
1.1地球运动>坐标改变
1.2 轨迹椭圆>椭圆参数方程(x,y)
1.3 不停的运动 > 定时器
2
isYES是一个BOOL值
isYES = !isYES
if(isYES)
{
}else
{
}
每次会自动取反
3 线程
3.1 NSThread*thread = [[NSThread alloc] initWithTarget:self selector:@selector(myThread) object:nil];
3.2 //加号方法 创建线程
[NSThread detachNewThreadSelector:@selector(myThred) toTarget:self withObject:nil]
//detach 分离
4 //剪裁
imageView.clipsToBounds = YES;
imageView.layer.cornerRadius = 40;
==================
20140724 星期四
==================
1 进程:一个任务的执行 (会消耗CPU)
线程:程序独立调度,独立执行的最小单位. 一个程序至少包含一个主线程,可以包含多个分线程.
分线程是为了防止主线程被卡死.
更新UI一定要放在主线程中
NSLog(@"%hhd",[NSThread isMainThread]);
当分线程绑定的方法结束时就意味着分线程结束.
2 导航控制器
UINavigationController : UIViewController
SDK软件开发工具包 software development kit
使用导航器时需要初始化导航器的根视图控制器(initWithRootViewController:vc),然后把导航器的对象赋给window的根视图控制器,默认界面显示,上方是导航条,下方是导航器的根视图View
3 隐藏信号区
Supporting Files >info.plist(属性列表文件)>添加View controller-based status bar appearance
=====================================================================
导航器管理页面跳转:
1压栈
pushViewController
2 出栈
2.1 popViewController (只出栈当前的)
2.2 popToRootViewController(出栈到根视图控制器)
2.3 popToViewController(出栈到指定的视图控制器)
导航条只有一个。
导航项可以有多个。
3
1 第一个界面没有标题,跳转到第二个界面,左上角的按钮默认是标题是Back,点击Back,可以返回到一界面。
2 第一界面有标题First,则第二界面左上角按钮默认标题为First,且点击可以返回到一界面。
3 如果只是改变第二界面左上角按钮的标题,则需要在第一界面的类中设置backButtonItem,但是不会响应绑定的方法。
4 在第二个界面上设置左上角的按钮。则返回逻辑,需要自己处理。
优先级:4 > 3 > 2 > 1
4 self.navigationItem.titleView
================================================================
// UIBarButtonItem
// 1 initWithTitle 标题
// 2 initWithBarButtonSystemItem 系统
// 3 initWithCustomView 自定义视图
// 4 initWithImage 图片
// 5 initWithImage:landscapeImagePhone: 图片(包括竖屏和横屏显示不同的图片)
UIBarButtonItem *rigthBtnItem= [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"down.png"] landscapeImagePhone:[UIImage imageNamed:@"up.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rightBtnClick)];
self.navigationItem.rightBarButtonItem =rigthBtnItem;
=====================================================================
// 行为表
// UIActionSheet UIAlertView
// destructive 谨慎操作的按钮标题
UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:@"tips" delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"Save", nil];
// showInView 在视图上显示
[sheet showInView:self.view];
==================
20140725 星期五
==================
1 -(void)viewWillAppear:(BOOL)animated 即将显示
获取按钮标题
获取按钮的标题
UIButton *button = (UIButton *)sender;
NSString *number = [button titleForState:UIControlStateNormal];
-(void)fire 让定时器立即执行
1. 让定时器立即执行
[timer fire]让定时器直接运行 //不建议使用,fire能让定时器立即开启
2.遍历的两种方法 (泛型遍历) 不是同一种对象用ID接收
如果数组中的存放的类型不统一,或者不清楚数组中是什么类型,则可以使用ID类型的变量来接收
v=========堆 栈 静态===========v
堆 堆(英语:heap)亦被称为:优先队列(英语:priority queue),是[url=x-dictionary:r:]计算机科学[/url]中一类特殊的[url=x-dictionary:r:]数据结构[/url]的统称。堆通常是一个可以被看做一棵树的数组对象。在[url=x-dictionary:r:]队列[/url]中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构
栈 堆栈([url=x-dictionary:r:]英语[/url]:stack),也可直接称栈。台湾作堆叠,在[url=x-dictionary:r:]计算机科学[/url]中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,[url=x-dictionary:r:]英语[/url]:top)进行加入资料([url=x-dictionary:r:]英语[/url]:push)和输出资料([url=x-dictionary:r:]英语[/url]:pop)的运算。另外堆栈也可以用一维[url=x-dictionary:r:]阵列[/url]或[url=x-dictionary:r:]连结串行[/url]的形式来完成。堆栈的另外一个相对的操作方式称为[url=x-dictionary:r:]伫列[/url]。
由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。
堆栈数据结构使用两种基本操作:推入(push)和弹出(pop):
- 推入:将数据放入堆栈的顶端(阵列形式或串行形式),堆栈顶端top指标加一。 弹出:将顶端数据资料输出(回传),堆栈顶端资料减一。
^=========堆 栈 静态===========^
3.静态变量
静态变量拥有全局边变量的特征 静态 变量只会执行一次
4.设置图片可交互(查)
_imgView.userInteractionEnabled = YES;
5. 裁剪多余部分,只留下相交部分(实际还存在 只是不显示)
vi.clipsToBounds=YES vi:父视图 沿着父视图边界剪切子视图超出部分,只留下重叠部分
NSLog(@"%@",NSStringFromCGRect(imageView))
6. 代理
6.1 代理???n.
代理人,代理商。。。
6.2 协议 约定 规则。 协议方法。
@protocol 定义协议
@protocol
…协议方法
@end
alertView actionSheet默认都有协议方法。当设置delegate,实现了协议方法,并且明确触发事件(比如点击 alertView上的按钮),这样就能够自动是响应协议方法。
6.3 触发事件。只是为了明确何时调用协议方法。
设置代理>>>定义协议>>> 触发事件>>>代理实现协议
1 透明色
[UIColor clearcolor]
2 delegate和protocol是共存亡的
触发事件做了一件事[delegate protocol]
3 (当协议在多个类中使用时可以把协议独立出来)协议可以单独写在一个文件中,使用时倒入协议头文件就行,@class可以避免交叉倒入的错误.
4 基础协议 NSObject
@protocol ZYCustomAlertDelegate <NSObject>
//定义了一个协议 协议名为ZYCustomAlertDelegate 并且实现了基础协议NSObject
入口方法就是协议方法
==============================================================
1 背景图片
bg@2x.jpg @2x 适配高清屏(retina)
640 * 960
640 * 1136
bg.jpg (320 * 480) 不用了。
bg@2x.jpg (640 * 960)
bg@568h.jpg (640 * 1136)
2 按钮图片
按钮在想以图片显示时,必须考虑按钮的类型。
SystemType setBackgroundImage
Custom setBackgroundImage
setImage
设置背景图片的同时是可以设置标题的。
btn setBackgroundImage:[UIImage imageNamed:@"s_0.png"] forState:UIControlStateNormal];
3 导航条隐藏
搜索界面导航条不隐藏
self.navigationController.navigationBarHidden = NO;
4 URL(Uniform Resource Locator) 统一资源定位符 网址
5 泛型遍历
for (ZYBtn *btn in _itemArray)
6 数组的简便写法
创建数组 (只能创建不可变数组) NSArray* _urlArry = @[@"1",@"2"];
取对象 _urlArry[0];
6 颜色宏定义
#define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]
=====================================================
1 . label标题居中
_lable.textAlignment = NSTextAlignmentCenter
2 按钮选中时
[btn setBackgroundImage:[UIImage imageNamed:@"w_xq1.png"] forState:UIControlStateSelected];
协议方法前面都有一个当前类的对象是为了,当前类创建多个对象时用于区分;
3 #pragma mark -快速定位方法
=================================
==================
20140806 星期三
==================
1 UIPickerView
选择器
// 设置picker的数据源和代理,目的是将来为了调用协议方法
picker.dataSource = self;
picker.delegate = self;
// 设置显示中间的那两条线(选择指示器)
picker.showsSelectionIndicator = YES;
#pragma mark 标记
2 协议方法分为两种 必须实现的协议方法 @required
可选择的协议方法 @optional
3 // 获取两列中已经选择的行号
_firstRow = [pickerView selectedRowInComponent:0];
_secondRow = [pickerView selectedRowInComponent:1];
// 指定显示某列某行
[_picker selectRow:1 inComponent:0 animated:YES];
[_picker selectRow:1 inComponent:1 animated:YES];
重新加载(刷新) 所有 的 列
reloadAllComponents 会重新的调用pickerView的所有的与pickerView构建和显示相关的协议方法。
[_picker reloadAllComponents];
指定刷新某列
[_picker reloadComponent:0];
4 字典
字典分为不可变字典 NSDictionary 和可变字典 NSMutableDictionary
1 字典中的键与值是一一对应,一个键只对应一个值,不能存储相同的键。
2 字典是无序的。
4.1 NSDictionary 和 NSMutableDictionary—字典,其条目储存为键-值对;键是唯一的标识符,通 常为字符串,而值则是您要储存的对象。通过指定键,您可以访问该对象。
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"laosun",@"L",@"zhiyou",@"Z",@"1",@"num",@"a",@"char",nil];
_dic = [[NSDictionary alloc]initWithObjectsAndKeys:@[@"1",@"2",@"3"],@"number",@[@"l",@"a",@"o",@"sun"],@"zhiyou", nil];
4.2 // 获取dic中所有的 值(allObjects)
NSArray *values = [_dic allValues];
4.3 // 获取dic中所有的 键
_keysArr = [_dic allKeys];
4.4 通过键值取对象
id obj = [dic objectForKey:@"L"];
5 UIDatePicker 日期选择器
@interface UIDatePicker : UIControl <NSCoding>
5.0
设置模式 默认显示的模式是日期和时间
datePicker.datePickerMode = UIDatePickerModeDateAndTime;
5.1 UIDatePicker *datePicker = (UIDatePicker *)sender;
NSLog(@"当前的日期和时间为 %@",datePicker.date);
// 2014-08-06 10:12:23 +0000 格林尼治时间 0 时区 北京的时间 东八区。
// 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
// G 纪元 AD 公元
// yyyy 年 2014
// MM 月 08
// M 月 8
// dd 日 06
// d 日 6
// eeee 星期 Wednesday
// eee 星期 Wed
// ee 星期 04
// e 星期 4
// a 上下午 PM
// hh 时 05 12小时制
// HH 时 17 24小时制
// mm/m 分 03/3
// ss/s 秒 08/8
// 设置日期的格式
[formatter setDateFormat:@"G yyyy年MM月dd日 eeee a HH:mm:ss"];
// 设置星期,要从星期日开始呀
[formatter setWeekdaySymbols:@[@"星期日",@"星期一",@"星期二",@"星期三",@"星期四",@"星期五",@"星期六"]];
[formatter setAMSymbol:@"上午"];
[formatter setPMSymbol:@"下午"];
// stringFromDate 通过formatter设置的日期格式将datePicker显示的date变成string。
NSString *dateStr = [formatter stringFromDate:datePicker.date];
NSLog(@"=====> %@",dateStr);
_textField.text = dateStr;
6 NSDate
NSDate *date = [NSDate date]; 返回当前类的对象
1 内存管理
分配alloc和释放release
c c++手动管理 特点:执行效率非常高,开发时较为复杂
java 自动内存管理 ,边运行程序边进行垃圾回收,方便了开发者,牺牲了执行效率
oc 半自动内存管理,不需要直接释放,只需要告诉系统什么时候释放即可,通过”引用计数”来告诉系统是否要被释放,当引用计数为0时系统就释放该对象,释放后该对象的”引用计数将消失”,即retainCount不存在了.(retainCount是NSObject的属性)
// 内存管理(在非ARC下)
// 内存的分配和释放。
// 创建一个对象就占内存,如果对象不再使用,则释放掉。
引用次数不会打印为0,语句会调用该类的dealloc方法,该方法的执行就意味着指针所指的对象已经彻底释放(查)
1.1
// 对于一个对象释放彻底释放,需要明确该对象的引用计数是否为0.
// 引用计数只能作为内存管理的参考。
// 1 创建一个对象,则对象的引用计数默认为1
// 2 retain方法会使得对象的引用计数+1
// 3 release方法......-1
// 4 retainCount减到0时会自动调用该对象的类的dealloc方法,而此方法的执行,意味着该对象彻底释放掉。
// 5 对象已经释放了,那么以后就不要再使用该对象,以免引起程序的crash
// 6 引用计数只能作为内存管理的参考。
(Xcode5以上arc Automatic Reference Count 即自动管理引用计数 使用次数 (有多少指针指向))
1.2 *类对象的内存管理
1.2.1凡是通过alloc,new,copy创建的对象引用计数都为1
1.2.2 查看引用次数:NSLog(“%d”,指针.retainCount)
1.2.3[指针 retain] 引用计数加1
1.2.4[指针 release] 引用计数减1
1.2.5 系统即将释放对象时,所有生物全局指针在dealloc方法中进行release
1.2.6局部指针在方法结束之前release
1.2.7内存泄露:一个指针指向一个对象之后,在对另一个对象初始化时,再次使用该指针,前面的一个对象必须先背释放,即改变指向对象时,把之前的对象release.否则前一个对象无法通过指针找到,在程序结束之前将一直存在,即内存泄露.(有内存未被释放),内存泄露过度程序将崩溃.
如果某个指针经常改变指向对象,可以对该指针进行属性描述,打点调用,之后不需要考虑内存问题.
1.2.8 alloc(new,copy)与release, retain和release必须成对出现.
1.2.9 内存管理原则:谁创建(alloc)谁释放(release),谁使用(retain)谁释放(release)
1.2.10 release过度(过度释放)会使程序崩溃
1.3 控件的的类存管理
1.3.1assSubview会使控件的引用次数加1;
1.3.2把对象放入数组,对象的引用次数加1,放进去几次加几次,谁使用谁管理内存,如果把前面的一个数组放进另一个数组,前一个数组里的对象的引用计数不会再增加;
1.4 @property的内存管理由系统自动完成
1.5加号方法创建的对象会自动释放autorelease
1.5.1 autorelease 自动释放,不是立马释放,会把lab对象添加到NSAutoReleasePool中 将来 会完成释放。
对一个对象释放十分确定,则直接使用release方法,如果对对象不是立马释放,则使用autorelease。
1.6 基本类型(变量)不需要内存管理,(变量和指针的存放位置不同)
1.7 NSTimer如果未被释放则不会执行dealloc方法,所以页面结束之前一定要摧毁NSTimer,指针设为空
1.8 UIImage用imageName创建的图片,系统自动释放 autorelease ,除非程序结束否则图片基本不会被释放,如果图片过多,内存占用过多时还是alloc为妙
1.9导航器的内存管理
push会增加引用计数,pop会释放,和压栈出栈有关
2 属性描述类型
基本类型用(nonatomic,assign)
对象指针用(nonatomic,retain)
字符串类型(nonatomic,copy)l
delegate描述用(nonatomic,assign)delegate:防止相互retain更改get方法名时(nonatomic,getter = is…..);
3 内存管理原则
3.1 谁创建谁释放,谁使用谁释放
3.2创建者或者使用者不在使用对象就可以释放他,但是不要释放他人的引用
3.3如果要使用一个对象,则一定要保证该对象的创建时,要对该对象retain
4 苹果官方 基础内存管理规则
4.1 你拥有你创建的任何对象
4.2 你可以使用retain获取一个对象的拥有权
4.3 当你不再需要它,你必须放弃你拥有的对象的拥有权
4.4 你一定不能释放不是你拥有的对象的拥有权
类都用dealloc释放
1 表视图 UITableView
UITableView 继承与UIScrollView UITableView : UIScrollView
因为其继承与UIScrollView所以
tableView.dataSource = self;
tableView.delegate = self;
contentView
如果放在self.view上,不容易找到 bounces 回弹
1 自定义cell 3种方式
1.1在if里面创建 添加(contentView), 在if语句外完成配置.(return的cell要么是新建的,要么是重用的)
每个cell在tableView中的indexPath时唯一的.重用的的时cell的对象,但是indexPath不会改变
//indexPathForCell 在表中 cell对应的索引路径
NSIndexPath *indexPath = [_tableView indexPathForCell:cell];
NSLog(@"当前按钮所在的cell,在表中的位置为第%d区,第%d行",indexPath.section,indexPath.row);
1.2 自定义类继承自UITableViewCell ZYTableViewCell : UITableViewCell
在自定义方法中完成创建相应控件,在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中直接打点调用
1.3 加载XIB
//加载xib Bundle 捆
NSArray*xib = [[NSBundle mainBundle]loadNibNamed:@"ZYTableViewCell" owner:nil options:nil];
//遍历数组找到cell
for (id obj in xib)
{
if ([obj isKindOfClass:[ZYTableViewCell class]])
{
//如果对象时ZYTableViewCell,那么就直接把对象强制类型转换成cell
cell = (ZYTableViewCell*)obj;
break;
}
}
2 通过btn找cell
ZYTableViewCell*cell = (ZYTableViewCell*)btn.superview.superview.superview;
NSString*str = [NSString stringWithFormat:@"%@"@"--"@"%@",cell.label1.text,cell.label2.text];
3. CGAffineTransform 仿射变换
3.1 移动
_imageView.transform = CGAffineTransformMakeTranslation(100, 100);
3.2 缩放
_imageView.transform = CGAffineTransformMakeScale(2, 2);
3.3 累计方法缩小 n倍
_imageView.transform = CGAffineTransformScale(_imageView.transform, 0.5, 0.5);
3.4 旋转
_imageView.transform = CGAffineTransformMakeRotation(_angle);_angle是弧度值
1 tableView的类型
1.1 UITableViewStylePlain 没有区头 不显区头 向上滑动区头不会移动到屏幕外面
’ 1.2 UITableViewStyleGrouped 有区头 表滑动,区头会移动
2 cell accessory cell的配件
//cell配件(accessory)
// 0 none 什么也没有
// 1 DisclosureIndicator 多了一个指向右侧的按钮
// 2 DetailButton 详细信息按钮
// 3 Checkmark 对勾
// 4 DetailDisclosureButton 详细信息按钮 + 指向右侧的箭头
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
还可以在设置huadong
3 设置cell 选中状态
//设置选择类型 默认为灰底
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
4 NSCopying 协议 作用是只有实现此方法的类就可以调用copy方法
系统的某些类是默认实现NSCopying协议,诸如NSSting,NSArray,NSDictionary等;
所以 之前的People的类的对象默认是不能调用copy方法,因为People没有实现NSCopying协议中的copyWithZone方法.
临时字符串的引用计数是 -1 NSString *str = @"laosun";
通过创建字符串的对象的方式 引用计数为1 可以进行拷贝 引用计数加 1 效果等同于retain
NSString *str1 = [NSString stringWithFormat:@"laosun"];
4.1 浅拷贝 copy
retain拷贝的时指针,对象只有一个,结果使得对象的引用计数 + 1
4.2 深拷贝 真正意义上的拷贝,只是要产生两个对象,而且每个对象的引用计数是1
5 // 此属性就可以代替 设置区头高度的 协议方法
_tableView.sectionHeaderHeight = 50;
6 创建tableView所必须的三个方法
6.1 //在tableView上有几个区域
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
6.2 //每个区域有多上行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
6.3 每一行的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
7 相关协议
7.1 区头需要多个控件 则可以先创建一个View,然后再view上添加控件,view和相关控件在如下的方法中创建
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
7.2 设置cell的编辑风格
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
风格类型
7.2.1 UITableViewCellEditingStyleDelete 删除
7.2.2 UITableViewCellEditingStyleInsert 插入
7.2.3 UITableViewCellEditingStyleNone 默认
7.3 cell是否可以移动 返回的时一个BOOL值
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
7.3.1 用来移动的三杠
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
移动逻辑: 取>删>添加
7.4 完成编辑
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
删除和插入所做的操作写在这里 删除逻辑:删除对象 > 删除行
8 展开闭合逻辑:
通过一个bool值判断(_falg[3]),如果是yes则返回相应数组的count,否则返回0 (在和行相关的方法中),刷新相应的行的数据
9 表的编辑 增 ,删 ,移
www.tinyletter.com www.stackoverflow.com
1 工具栏 UIToolbar
2 textField 协议方法
一旦TextField成为第一响应,此方法就会调用
- (void)textFieldDidBeginEditing:(UITextField *)textField
3 当点击textFiled时键盘弹上去 同时消息内容向上滑动,表紧挨着键盘显示最后一行数据
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
4 图片拉伸 stretch 拉伸 以左边的宽和上边的高度 沿边界 顶盖的覆盖区域不进行缩放和调整大小
UIImage *handsomeImage = [uglyImage stretchableImageWithLeftCapWidth:25 topCapHeight:15];
5
// 注册一个类(cell class) IOS6
// 创建的cell 默认类型是Default,如果想要改变cell的类型,必须自定义一个UITableViewCell的子类。
// [tableView registerClass:[TableViewCell class] forCellReuseIdentifier:cellIdentifier];
6 ZYTableViewController
6.1 需要创建导航器
6.2 viewDidLoad
6.2.1
// 当当前的view将要显示时,是否清空cell的选中状态。 如果为NO,则pop回来之后,仍然记录之前cell的选中状态。
self.clearsSelectionOnViewWillAppear = NO;
6.2.2
// 在导航条上右边会出现一个'Edit'按钮,默认实现表的编辑状态的改变。
self.navigationItem.rightBarButtonItem = self.editButtonItem;
[[NSBundle mainBundle] pathForResource:<#(NSString *)#> ofType:<#(NSString *)#>]找到某一个资源
==================
20140814 星期四
==================
1 沙盒
1.1 IOS中每一个应用程序都有一个单独封闭的文件夹,这个文件夹称为沙盒
1.2 沙盒目录用来存放APP的本地文件,例如:音频,视频,图片文件.....
1.3 当前APP应用程序没有权限访问其他APP的沙盒(更安全).
1.4 模拟器上的沙盒路径
/Users/zhiyou3g/Library/Application Support/iPhone Simulator/7.1/Applications
1.5 沙盒中有如下子目录
Documents 存放长期使用文件
Library 系统存放文件
tmp 临时文件,APP重启,该目录下的文件会清空
2 路径用NSString来描述
2.1 获取沙盒主目录路径
//沙盒主目录
NSString*homePath = NSHomeDirectory();
NSLog(@"homePath==%@",homePath);
2.2 在主目录下搜索其他目录
//从主目录下搜索
//Documents目录
NSString*documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];
NSLog(@"documentsPath==%@",documentsPath);
//library目录
NSString*libraryPath = [homePath stringByAppendingPathComponent:@"Library"];
NSLog(@"libraryPath==%@",libraryPath);
//tmp目录
NSString*tmpPath = [homePath stringByAppendingPathComponent:@"tmp"];
NSLog(@"tmpPath==%@",tmpPath);
====================================
====================================
//1 获取路径
//沙盒主目录
NSString*homePath = NSHomeDirectory();
NSLog(@"homePath==%@",homePath);
//从主目录下搜索
//Documents目录
NSString*documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];
NSLog(@"documentsPath==%@",documentsPath);
//library目录
NSString*libraryPath = [homePath stringByAppendingPathComponent:@"Library"];
NSLog(@"libraryPath==%@",libraryPath);
//tmp目录
NSString*tmpPath = [homePath stringByAppendingPathComponent:@"tmp"];
NSLog(@"tmpPath==%@",tmpPath);
//============================================
// 1 2 两部分都用 stringByAppendingPathComponent 但是一般把第一部分称为搜索,第二部分称为追加,其实二者功能是一样的都是把路径保存到字符串中,说追加更合理,否则容易造成误解
// 路径其实就是一串字符串
//============================================
//2 NSString处理路经
//演示路径 /Users/apple/file.text
NSString*demoPath = @"/Users/apple/file.text";
// 2.1 获取路径的组成部分 "/" "Users" "apple" "File.text"
NSArray *components = [demoPath pathComponents];
NSLog(@"demoPathComponents===%@",components);
// 2.2 获取路径的最后一个组成部分
NSString*lastName = [demoPath lastPathComponent];
NSLog(@"lastName===%@",lastName);
// 2.3 追加文件或目录 /Users/apple/file.text/app.text
NSString*addFilePath = [demoPath stringByAppendingPathComponent:@"app.text"];
NSLog(@"追加%@",addFilePath);
//2.4删除最后的部分
NSString*afterDeletePath = [addFilePath stringByDeletingLastPathComponent];
NSLog(@"deleteAfterPath===%@",afterDeletePath);
// 2.5 取得最后部分扩展名
NSString*extName = [afterDeletePath pathExtension];
NSLog(@"extName===%@",extName);
// 2.6 追加扩展名
NSString*addExtNamePath = [afterDeletePath stringByAppendingPathExtension:@"jpg" ];
NSLog(@"addExtNamePath===%@",addExtNamePath);
// 3 NSData
//NSData是对数据的一种抽象.任何数据都可以通过NSData来存储,NSMutableData是可变的,继承NSData
// 4 NSFileManager 创建 复制 删除 剪切
// 4.1 NSFileManager管理文件常用办法
// 4.2创建文件
//创建NSFileManager对象
NSFileManager*fileManager = [NSFileManager defaultManager];
NSString*homePath1 = NSHomeDirectory();
NSLog(@"homePath1====%@",homePath1);
NSString*pathMg = [homePath1 stringByAppendingPathComponent:@"liRuYi2.text"];
//创建内容
NSString*text = @"媒介生而平等,但有的媒介比其它媒介更加平等,不是人们不读书了,而是文字阅读已经不再是唯一有价值、有营养的阅读形态了。";
//将字符串转换成NSData类型
NSData*date = [text dataUsingEncoding:NSUTF8StringEncoding];
//写入文件
BOOL success = [fileManager createFileAtPath:pathMg contents:date attributes:nil];
NSLog(@"%d",success);
// 4.3读取文件
// 4.3.1 创建NSFileManager对象
NSFileManager*fileManager2 = [NSFileManager defaultManager];
//4.3.2 根据路径读取文件
NSData*fileDate = [fileManager2 contentsAtPath:pathMg];
//4.3.3 将NSDate转换成NSString
NSString*content = [[NSString alloc] initWithData:fileDate encoding:NSUTF8StringEncoding];
NSLog(@"content=====%@",content);
// 4.4 剪切复制
NSString*homePath3 = NSHomeDirectory();
//源文件路径
NSString*srcPath = [homePath3 stringByAppendingPathComponent:@"liRuYi2.text"];
//目标路径
NSString*toPath = [homePath3 stringByAppendingPathComponent:@"Documents/file.text"];
//4.4.1剪切(移动)文件
//将src路径的文件剪切到toPath路径
BOOL isSuccess = [fileManager2 moveItemAtPath:srcPath toPath:toPath error:nil];
NSLog(@"%d",isSuccess);
//4.4.2 复制文件
//源文件路径
NSString*srcPath2 = [homePath3 stringByAppendingPathComponent:@"file.text"];
//目标路径
NSString*toPath2 = [homePath3 stringByAppendingPathComponent:@"Library/good.text"];
BOOL success2 = [fileManager2 copyItemAtPath:srcPath2 toPath:toPath2 error:nil];
NSLog(@"%d",success2);
// 4.5 删除文件
//判断文件是否存在
NSString*deletePath = [homePath3 stringByAppendingPathComponent:@"liRuYi2.text"];
BOOL isExist = [fileManager2 fileExistsAtPath:deletePath];
if (isExist) {
//删除文件
BOOL seccessDelete = [fileManager2 removeItemAtPath:deletePath error:nil];
if (seccessDelete) {
NSLog(@"remove success");
UIAlertView*alertView = [[UIAlertView alloc] initWithTitle:nil message:@"remove success" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
[alertView show];
}
}
// 4.6获取文件大小
//获取文件的属性字典
NSDictionary*fileDic = [fileManager2 attributesOfItemAtPath:toPath2 error:nil];
//获取文件大小
NSNumber*fileSize = [fileDic objectForKey:NSFileSize];
NSLog(@"fileSize=======%@",fileSize);
// 5 写文件
// 数组 字典 字符串 NSData都是容纳数据的,他们都有一个writeToFile的方法
//5.1数组写入文件
NSString *str1 = @"明月几时有";
NSString *str2 = @"把酒问青天";
NSArray *array = [NSArray arrayWithObjects:str1,str2, nil];
NSString*path10 = [homePath stringByAppendingPathComponent:@"hehe.text"];
//将数组中的数据写入文件
[array writeToFile:path10 atomically:YES];
NSString*path11 = [homePath stringByAppendingPathComponent:@"hehe.plist"];
[array writeToFile:path11 atomically:YES];
// 5.2 属性列表文件
// 数组只能写入NSNumber NSString NSDate NSData NSArray NSDictionary
// 数组,字典写入的文件叫属性列表(plist),可以用xcode打开编辑
// 6 读文件
// 数组 字典 字符串 NSData 同样的可以将文件数据读入程序
// 6.1数组读文件
//通过alloc创建,并读入文件数据
NSArray*array1 = [[NSArray alloc] initWithContentsOfFile:path10];
NSLog(@"array1===========%@",array1);
//通过类方法创建,并读入文件数据
NSArray*arry2 = [NSArray arrayWithContentsOfFile:path11];
NSLog(@"arry2 ===== %@",arry2);
// 补充 创建文件夹
//[[NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask, YES)是一个数组,作用是获取路径
NSString*createDir = [[NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"test/test/test"];
//创建文件夹 createIntermediates该参数bool类型 是否创建文件夹路径中没有的文件夹目录
[fileManager createDirectoryAtPath:createDir withIntermediateDirectories:YES attributes:nil error:nil];
return YES;
========================================
========================================
bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了入图像,生音,编译好的代码,nib文件.对bundle,cococa提供了类NSBundle.我们的程序是一个bundle.在Finder中,一个应用程序看上去和其他文件没有区别.但是实际上他是一个包含了nib文件,编译代码,以及其资源的目录,我们把这个目录叫main bundle
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
1.对象序列化
NSCoding
1.1 编码
- (void)encodeWithCoder:(NSCoder *)aCoder;
1.2 解码 (初始化方法)
- (id)initWithCoder:(NSCoder *)aDecoder;
NSCoder abstract class 抽象类 不能实例化
编码 序列化
NSKeyedArchiver : NSCoder
解码 反序列化
NSKeyedUnarchiver : NSCoder
NSArray<NSSecureCoding <NSCoding> >
NSDictionary<NSSecureCoding <NSCoding> >
2 copy 和retain的区别
copy重新开辟了一片内存,原对象删除不会堆copy后的对象造成影响 ,retain只是引用计数加1,删除有影响.例子:数组
3 copy和mutableCopy的区别
前者用于不可变数组,返回不可变对象副本,后者用于可变数组,返回可变对象副本.
4 浅拷贝和深拷贝
浅拷贝好比你和你的影子,你完蛋,你的影子也完蛋
深拷贝好比你和你的克隆人,你完蛋,你的克隆人还活着。
Screen Shot 2014-08-18 at 7.53.34 PM.png
4.1对象拥有复制特性,必须实现NSCopying或者NSMutableCopying协议的该协议的copyWithZone:方法(返回不可变对象)和mutableCopyWithZone:方法(返回可变对象)
4.2对象的深,浅拷贝的区别就在于对copyWithZone的不同实现
Screen Shot 2014-08-18 at 7.59.58 PM.png
5 对象的归档
概念:对象归档是指将对象写入文件保存在硬盘上,当再次重新打开程序时,可以还原这些对象.亦可以称作对象序列化 ,对象持久化
5.1 数据持久化的方式
NSKeyedArchiver——对象归档
NSUserDefaults
属性列表化(NSArray,NsDictionary保存文件)
SQlite数据库,CoreData
5.2 归档的形式
对Foundation库对象进行归档
自定义对象进行归档(需要实现归档协议,NSCoding)
归档后的文件是加密的,属性列表是明文的
//归档 (序列化) 编码
NSString*homeDirectory = NSHomeDirectory();
NSArray *array5 = @[@123,@456,@"999",@"000"];
NSString*filePath = [homeDirectory stringByAppendingPathComponent:@"array.archive"];
if ([NSKeyedArchiver archiveRootObject:array5 toFile:filePath]) {
NSLog(@"archiver success");
}
//解归档(反序列化) 解码
NSArray*unArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"new Array:%@",unArray);
6 自定义内容归档
6.1 归档
使用NSData实例作为归档的存储数据
添加归档的内容 (设置key和value)
完成归档
将归档数据存入磁盘中
6.2 解归档
从磁盘读取数据,生成NSData实例
根据Data实例创建和初始化归档实例
解归档,根据key访问value的值
// archiver 压缩程式
//自定义内容归档
//归档 序列化 编码
NSString*homePath = NSHomeDirectory();
NSString*customfilePath= [homePath stringByAppendingPathComponent:@"customContent.archive"];
NSMutableData*data = [NSMutableData data];
NSKeyedArchiver*archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeFloat:50.0 forKey:@"weight"];
[archiver encodeObject:@"Tim" forKey:@"name"];
[archiver finishEncoding];
[archiver release];
[data writeToFile:customfilePath atomically:YES];
// 解归档
//读取归档数据
NSData*content = [NSData dataWithContentsOfFile:customfilePath];
NSLog(@"%@",content);
//解归档
NSKeyedUnarchiver*unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:content];
//解归档数据
float weight = [unarchiver decodeFloatForKey:@"weight"];
NSString*name = [unarchiver decodeObjectForKey:@"name"];
NSLog(@"-----%f-------%@",weight,name);
7 自定义对象的归档基本概念
对象要支持归档,需要实现NSCoding协议
NSCoding协议有两个方法,encodeWithCoder方法对对象的属性数据做编码处理,initWithCoder解码归档数据来初始化对象
实现NSCoding协议后,就能通过NSKeyedArchiver归档.
//编码 obj----> data
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// <NSKeyedArchiver: 0x8e7c160>
NSLog(@"这是一个编码的方法,作用就是对当前类的属性进行一一编码--%@",aCoder);
// 对属性进行编码
[aCoder encodeObject:_nameStr forKey:KEY_NAME];
[aCoder encodeObject:_phoneStr forKey:KEY_PHONE];
}
//解码 data---> obj
- (id)initWithCoder:(NSCoder *)aDecoder
{
// <NSKeyedUnarchiver: 0x8f4e910>
NSLog(@"这是一个解码的方法,作用就是对保存在NSCoder对象中编过码的数据进行解码,在一一的赋值给当前类的属性。--- %@",aDecoder);
self = [super init];
if (self)
{
// 这里的获得的解码过后的对象,用当前的属性保存,要使用self.
self.nameStr = [aDecoder decodeObjectForKey:KEY_NAME];
self.phoneStr = [aDecoder decodeObjectForKey:KEY_PHONE];
}
return self;
}