day02-Strong&weak; 图片浏览器、tom 猫
前言
一、 用纯代码开发的过程:
1. 确定界面元素,要有什么内容
2.用代码搭建界面
3.编写代码
二、@property
1.创建了getter & setter方法
2. 生产一个变量名为带_ 的成员变量;直接读取成员变量不会经过getter&setter方法
三、 解决代码执行顺序的存在依赖的方法‘
采用懒加载,即通过重写getter方法实现,达到的效果是,在对象最需要的时候创建–重写getter方法
1.资源属性的懒加载
2.#pragma mark - 控件的懒加载
四、weak &strong
- 在oc 中,如果对象没有被强引用,会被立即释放
- 默认的对象都是强引用
__weak 表示弱引用 Assigning retained object to weak variable; object will be released after assignment
- 默认的对象都是强引用
3.使用场景:
/**
控件的使用
1).如果界面的搭建,是采用storyBoard进行连接,控件属性用weak
2).如果是采用纯代码搭建界面,控件可以使用strong进行修饰;因为此时控件的对象的两个强引用(ViewController的noLable,以及view的subview)都会随着控制器ViewController的销毁而被释放。
[self.view addSubview:_noLabel];
//将弱引用参照的_noLabel添加到视图UIView;UIViewController.h-》@property(null_resettable, nonatomic,strong) UIView *view;-》UIView.h :@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;-》强引用UILabel对象,所以这个UILabel对象已经有拥有者,不会被放--再添加过程都是操作UILabel对象的地址
- oc中释放对象的过程
程序先对控制器进行释放,如果没有对象对View进行强引用,程序将对view进行释放,
内存中如果没有存在对subviews 的NSArray对象进行强引用,就释放subviews;
此时如果UILabel对象没有被强引用,UILabel对象将被释放
- 其他情况下,
1)创建的自定义对象,都用strong。--因为这些对象不会有UIViewController的控制,来进行强引用
2)NSString 使用copy;NSString应该使用copy而不是strong的属性特性。为什么?即使你声明一个NSString的属性,有人可能传入一个NSMutableString的实例,然后在你没有注意的情况下修改它。
3)数字型的,比如int ,就是使用assign
*/
五、相同代码封装抽取的思路
1)将相同的代码放到一个新方法中
2)将不同的值(button.tag)当做方法的参数传递进来: 在oc 中通常方法的第一个参数为:触发该方法的对象 --根据需要进行参数调整
六、Apple推荐使用的图片格式:p n g
1。jpg, 常常放置于Supporting Files目录
1)压缩比 比较高,通常用于照片、网页
2)属于有损压缩(噪点noise)
3)解压时对c pu 消耗大--意味着,慢、费电
2.p n g 常常放置于Assets.xcassets目录中,作为控件的背景图片
1)压缩 较高,无损压缩,解压效率高,对CPU消耗少
七、 关于图像的实例化--OC程序员时刻要记着内存的管理
方式一、有缓存加载图片
无缓存加载图片
//方式一:有缓存加载图片
+ (UIImage *)imageNamed:(NSString *)name 系统推荐使用的方法,但图像实例化之后的对象释放由系统负责。
// [arrayImage addObject: [UIImage imageNamed:pictureNamePrefix]];//参数为图片名称,png 格式的可以不加扩展名
2.方式二:无缓存方式加载图片(提示、如果放置于Assets.xcassets目录中的图片不能使用imageWithContentsOfFile:path进行加载;只能使用imageName进行加载,即内存由系统负责了)
例如加载如下图片的代码实现:
//方式二:无缓存方式加载图片-指定扩展名
// NSArray *arrayPicture = [pictureNamePrefix componentsSeparatedByString:@"."];//从字符中分隔成2个元素的数组(图片名+扩展名)
// NSString *path = [[NSBundle mainBundle] pathForResource:arrayPicture[0] ofType: arrayPicture[1]];//获取图片的全路径
//方式二:无缓存方式加载图片-不指定扩展名
NSString *path = [[NSBundle mainBundle] pathForResource:pictureNamePrefix ofType:nil];
[arrayImage addObject:[ UIImage imageWithContentsOfFile:path]];
/Users/devzkn/Library/Developer/CoreSimulator/Devices/949ED3EA-A51B-4B5C-99B1-8069EB99E684/data/Containers/Bundle/Application/2B2B99A6-4FBC-4171-BE4F-ECA1B5AA2590/09-tomcat.app/angry_00.jpg
{ //开始动画
[self.imageList startAnimating];
//释放资源:动画结束之后清除帧动画数组
//nvokes a method of the receiver on the current thread using the default mode after a delay.
[self performSelector:@selector(cleanUpAnimationsArray) withObject:nil afterDelay:self.imageList.animationDuration];//@interface NSObject (NSDelayedPerforming)
}
- (void)cleanUpAnimationsArray{
NSLog(@"%s ",__func__);
//动画结束之后清除帧动画数组
[self.imageList setAnimationImages:nil];
}
除内存的代码简化
[self.imageList performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageList.animationDuration];
正文
--
1.修改头文件的问题解决方法:
只要进行/Users/devzkn/Library/Developer/Xcode/DerivedData 目录文件进行清理&command+B
2.常用快捷键
1)文件跳转栏:Control+6(键入方法/变量名+Enter跳转)
2)快速帮助: 在类或者方法名上执行Option + Left-click操
3)一次性修改一个scope里的变量名:
点击该变量,出现下划虚线,然后command+control+E**所有相同变量,然后进行修改。
4)删除一个词:option+delete
5)文件内快捷搜索:
先点亮想要搜索的词,然后command+E将该次放入剪贴板,然后command+G来向下遍历该词,shift+command+G向上遍历。
5) 前后两行交换:command+option+[ 或 ]
6) 不同窗口间切换:command+`
7)前进和后退:command+control+ → 或 ←
8)折叠代码块:command+option+ → 或 ←
9)debug:
下一行:F6、进入方法:F7、跳出方法:F8
全速执行:command+control+Y
clear debug console:command+K
- tom 基本实现--序列帧动画
掌握的知识点、
1)UIImageView 帧动画的使用
2)UIImage的两种加载方式
有缓存方式的加载方法
无缓存方式将图片加载至内存
3)重复代码的封装抽取:等优化完毕之后,在删除被优化的旧代码;常见的优化点有,数据独立性的处理(plist、网络)、魔法数字的问题解决(宏,枚举enum)、属性的懒加载(重写getter方法)
- 代码示例
/**
序列帧动画:顺序播放一组图片
1.提示、如果放置于Assets.xcassets目录中的图片不能使用imageWithContentsOfFile:path进行加载,只能使用imageName进行加载,即内存由系统负责了;Assets.xcassets 存放一些经常使用的小图片素材
2。Supporting Files 目录通常存放,大、不经常使用的图片;
*/
- (void) frameAnimation : (UIButton *) button{
//如果正在动画播放直接退出,来保证保证一个动画播放完成
if ([self.imageList isAnimating]) {//考虑用户的重复点击进行频繁的展示帧动画问题
return;
}
//顺序的改变UIImageView 的image,此时需要的参数有:需要播放的序列帧图片数组animationImages(UIImage对象)、帧动画的持续时间animationDuration、帧动画的执行次数animationRepeatCount--可自行查看UIImageView的属性和方法
//动画图片的数组--可修改的数组NSMutableArray(manage a modifiable array of objects)
NSMutableArray *arrayImage = [NSMutableArray array];//Creates and returns an empty array.
//添加帧动画播放的图片
//设置图片的数组的
for (int i = 0; i< self.animationImages[button.tag].count ; i++) {
//获取图片名称
NSString *pictureNamePrefix = self.animationImages[button.tag][i];//获取文件名+扩展名
//方式一:有缓存加载图片
// 添加Image的对象到帧图片数组
// [arrayImage addObject: [UIImage imageNamed:pictureNamePrefix]];//参数为图片名称,png 格式的可以不加扩展名
//方式二:无缓存方式加载图片-指定扩展名
// NSArray *arrayPicture = [pictureNamePrefix componentsSeparatedByString:@"."];//从字符中分隔成2个元素的数组(图片名+扩展名)
// NSString *path = [[NSBundle mainBundle] pathForResource:arrayPicture[0] ofType: arrayPicture[1]];//获取图片的全路径
//方式二:无缓存方式加载图片-不指定扩展名
NSString *path = [[NSBundle mainBundle] pathForResource:pictureNamePrefix ofType:nil];
[arrayImage addObject:[ UIImage imageWithContentsOfFile:path]];
}
[self.imageList setAnimationImages:arrayImage];
//设置帧动画的持续时间
[self.imageList setAnimationDuration: self.imageList.animationImages.count * 0.1];
//设置帧动画的执行次数
[self.imageList setAnimationRepeatCount:1];
//开始动画
[self.imageList startAnimating];
//释放资源:动画结束之后清除帧动画数组
//nvokes a method of the receiver on the current thread using the default mode after a delay.
// [self performSelector:@selector(cleanUpAnimationsArray) withObject:nil afterDelay:self.imageList.animationDuration];//定义在NSObject的分类中@interface NSObject (NSDelayedPerforming)
//清除内存的代码简化--可以避免定义cleanUpAnimationsArray方法
[self.imageList performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageList.animationDuration];
}
总结
- 重写getter 和setter方法的注意点
self.属性 和属性的区别: @property 生产一个变量名为带 的成员变量;直接读取成员变量不会经过getter&setter方法
1.重写getter方法的时候避免使用self.属性,否则将出现循环调用getter
2.解决问题1,就应该采用_属性进行成员变量的读取,直接读取成员变量不会经过getter&setter方法。
- Strong&weak
(weak和strong)不同:
当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。 一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
例子:
想象我们的对象是一条狗,狗想要跑掉(被释放)。 strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。 weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
-
自动补齐,数字的格式化
NSString *pictureNamePrefix =[ NSString stringWithFormat:@”drink_%02d.jpg”,i];//不到两位的自动补零;不到两位的自动补零 %04d: 自动补齐四位,不足四位的,就在数字前面加0
上一篇: python异步存储数据详解
下一篇: 这就是变化