- 博客(59)
- 收藏
- 关注
原创 导航条显示隐藏问题(包含改变状态栏颜色)
开发中首页一般没有导航条,或者至少某些页面没有导航条,涉及到导航条的显示和隐藏,甚至如果在显示隐藏导航条的同时修改状态栏颜色,如果左侧右滑返回,导航条会出现问题,比如标题混乱,右滑一点就松开导致导航条不正常,再加上有的页面需要禁止右滑返回,看似很乱,以下demo解决上述问题,只需导入GXFBaseViewContoller类,在push之前,根据需要设置属性即可https://github.c
2017-09-19 19:04:52 853
原创 iOS总结3
电商类的倒计时,不是简单的定义一个时间,每隔一秒减一下,而是由后台服务器来写的先从服务器请求剩余的时间,开一个定时器NSTimer,根据需求的时间间隔来定义定时器,刚开始变得慢,到最后越来越快,根据需求的时间格式,来显示对应的剩余时间自动释放池使用场景,创建大量对象,开启一个子线程时,比如自定义NSOperation,需要重写main方法,并在里面使用@autoreleasepoo
2017-08-10 12:56:54 368
原创 数据存储
1. 归档:一般保存到Documents目录 student.data2. plist: 也保存到Documents目录 plist形式3. 偏好设置: plist形式,名称是:应用的包名.plist4. sqlite: 把数据库保存到Documents目录代码:https://github.com/shimenyimeng/iOS-data-storage参考
2017-03-14 09:25:22 379
原创 设置gif动图
使用SDWebImage加载动图。https://github.com/shimenyimeng/iOS-gif-SDWebImage
2016-12-07 16:00:48 567
原创 本地和远程推送通知参考资料
iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能。在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知 UI 等一系列新功能,非常强大。具体可以参考资源:活久见的重构 - iOS 10 Use
2016-11-15 15:46:35 301
原创 启动图片 Launch Image
点击 Assets.xcassets,点击下方的“+”,添加 LaunchImage,如图: 可以选择需要适配的样式,如图: 拖入相应大小的图片,图片名称可以任意命名,可以参考以下图片大小: 2X : 640*960 (4/4s) R4 : 640*1136 (5/5s/5c) R4.7 : 750*1334 (6) R5.5 : 1242*2208 (6 plus)图片配置好
2016-11-04 12:55:09 609 1
原创 无限轮播实现思路(封装)
以10组为例,以第5组为中间,描述中的“第1个”代表第0个item1. 请求数据,定义数组保存数据2. 自定义轮播视图loopView 定义方法- (instancetype)initWithImages:(NSArray *)images;把images传过去,在此方法中设置代理、注册cell3. 自定义flowLayout 设置一系列与cell布局有关的代码
2016-11-01 09:55:58 844
原创 pch文件设置
1. 创建pch文件2. 在build settings中搜索pch文件名(必要时把precompile Prefix Header设置为YES)3. 设置pch文件的路径,$(SRCROOT)/项目名/pch文件名 或者./项目名/pch文件名 或者finder中找到pch文件,直接把路径拖过来
2016-10-31 09:37:05 883
原创 AFNetworking 2.0 和3.0 的区别
1. AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。2. AFNetworking 3.0现已完全基于NSURLSession的API,这降低了维护的负担,同时支持苹果增强关于NSURLSession提供的任何额外
2016-10-30 22:53:39 3335
原创 堆和栈的区别
1. 管理方式,栈编译器自动管理,堆程序员控制,容易产生内存泄漏2. 大小,栈区小,连续先进先出,堆较大,不连续3. 栈存放变量以及对象的指针,堆存放对象本身4. 栈分配效率高于堆
2016-10-30 15:08:33 337
原创 SDWebImage的缓存机制
SDWebImage缓存机制的具体实现,先从内存取,内存没有再从沙盒取,沙盒有的话,要缓存到内存(每次都从沙盒取,然而沙盒频繁读取数据是很耗费性能的,所以把沙盒中的图片添加到缓存,下次再次滚动到此图片,缓存已经有了,就直接从缓存取出并赋值返回cell了),两者都没有才下载,操作一加入队列,首先缓存到沙盒,下载成功后才缓存到内存。下载操作类(NSOperation)、管理类(负责怎么获取图片,并且有
2016-10-30 14:55:37 399
原创 关于Runtime
1. 首先可以给系统的类扩展属性,这个属性是没有getter和setter方法的,需要实现,用objc_setAssociated...和objc_getAssociated...2. 还可以方法交换,调用这个方法走的是另外一个方法,Method m1 = Class_getINstanceMethod... Method m2 = Class_getINstanceMethod... Met
2016-10-30 14:51:12 314
原创 iOS总结2
runLoop 定时器(NSTimer, CADisplayLink)需要加入runLoop,注意不用时需要销毁,因为是addTarget传入self,self又对定时器强引用。开发中只有这一个地方会用到runLoopc语言中没有对象,c语言中对象其实就是结构体RAC接管了苹果的所有事件机制(addTarget,代理,通知,KVO,时钟,网络的异步回调),在信号内部通过3个
2016-10-30 14:39:31 502
原创 应用之间的跳转
涉及到跳转的几种常见情况1. 使用第三方登录时,需要跳转到社交app,比如QQ,微信等。2. 集成分享功能,目的是推广我们的app,分享消息到其他app,比如分享到QQ,微信等3. 第三方支付,比如支付宝支付、微信支付等4. 导航,需要跳转到系统自带的地图5. 还有跳转到系统的app,比如打电话、发短信等1. 应用跳转是根据协议头跳转的,想跳到哪个app,就需要去找
2016-10-29 10:14:40 781
原创 NSDate和NSValue
NADateint main(){ NSDate *date = [NSDate date]; // 日期格式化类 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // y 年 M 月 d 日 // m 分 s 秒 H (24)时 h(1
2016-10-28 12:46:14 252
原创 NSDictionary
NSDictionary key ----> value 索引 ----> 文字内容 里面存储的东西都是键值对 字典的创建 普通创建 NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
2016-10-28 12:44:40 233
原创 NSArray和NSSet
NarrayOC数组---只能存放OC对象OC数组不能存放nil值OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等这个array永远是空数组NSArray *array = [NSArray array];1、NSArray的创建NSArray *array2 = [N
2016-10-28 12:42:56 469
原创 OC结构体
#import int main(){/* NSRange(location length) NSPoint\CGPoint NSSize\CGSize NSRect\CGRect (CGPint CGSize) */ // NextStep Foundation // 比较两个点是否相同(x、y) BOOL b = CG
2016-10-28 12:41:02 303
原创 @protocol 代理模式总结
1.协议的定义 @protocol 协议名称 // 方法声明列表.... @end 2.如何遵守协议 1> 类遵守协议 @interface 类名 : 父类名 @end 2> 协议遵守协议 @protocol 协议名称 @end 3.协议中方法声明的关键字 1> @required (默认) 要求实
2016-10-28 12:39:24 271
原创 block
block要掌握的东西 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)(); 2> 如何利用block封装代码 ^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ {
2016-10-28 12:38:07 245
原创 autoreleaseyi应用
1.autorelease的基本用法 1> 会将对象放到一个自动释放池中 2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 3> 会返回对象本身 4> 调用完autorelease方法后,对象的计数器不变 2.autorelease的好处 1> 不用再关心对象释放的时间 2> 不用再关心什么时候调用release 3.autor
2016-10-28 12:37:04 273
原创 @property的内存管理
1.set方法内存管理相关的参数* retain : release旧值,retain新值(适用于OC对象类型)* assign : 直接赋值(默认,适用于非OC对象类型)* copy : release旧值,copy新值2.是否要生成set方法* readwrite : 同时生成setter和getter的声明、实现(默认)* readonly : 只会生成get
2016-10-28 12:35:47 282
原创 setter方法的内存管理
set方法的内存管理当时用alloc或者new 创建一个对象,就必调用release 或autorelease1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)3.谁retain,谁release4.谁alloc,谁release
2016-10-28 12:34:31 320
原创 引用计数器的基本操作
1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> dealloc * 当一个对象要被回收的时候,就会调用 * 一定要调用[super dealloc],这句调用要放在最后面 2.概念 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸
2016-10-27 15:47:14 585
原创 SEL
SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址。找到方法地址就可以调用方法,其实消息就是SEL 1.把test2包装成SEL类型的数据 2.根据SEL数据找到对应的方法地址 3.根据方法地址调用对应的方法间接调用test2方法[p performSelector:@selector(test2)]; [p test3:
2016-10-27 15:45:57 380
原创 description方法
person.h#import @interface Person : NSObject@property int age;@property NSString *name;@endperson.m#import "Person.h"@implementation Person// 决定了实例对象的输出结果//- (NSString *)descript
2016-10-27 15:45:06 720
原创 类的本质
1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次。 2.当第一次使用某个类时,就会调用当前类的+initialize方法 3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法) 先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)类本身
2016-10-27 15:44:05 393
原创 构造方法
person.h#import @interface Person : NSObject@property int age;@property id obj;@endperson.m#import "Person.h"@implementation Person@endmain函数int main(int argc, const c
2016-10-27 15:42:52 214
原创 成员变量的作用域
@public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private) @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected) @package : 只要处在同一个框架中,就能直接访问对象的成员变量 @int
2016-10-25 15:02:36 753
原创 点语法
person.h#import@interface Person : NSObject{ int _age; NSString *_name;}- (void)setAge:(int)age;- (int)age;- (void)setName:(NSString *)name;- (NSString *)name;@endperson.m
2016-10-25 15:00:26 222
原创 OC的三大特性之多态
多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象 4.局限性: 1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法#import // 动物@interface Animal : NSObject- (voi
2016-10-25 14:58:31 292
原创 OC的三大特性之继承
继承的好处: 1> 抽取重复代码 2> 建立了类之间的关系 3> 子类可以拥有父类中的所有成员变量和方法 注意点: 1> 基本上所有类的根类是NSObject#import /********Animal的声明*******/@interface Animal : NSObject{ int _age; double _weight;
2016-10-25 14:57:14 287
原创 OC三大特性之封装
set方法 1.作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤 2.命名规范: 1> 方法名必须以set开头 2> set后面跟上成员变量的名称,成员变量的首字母必须大写 3> 返回值一定是void 4> 一定要接收一个参数,而且参数类型跟成员变量类型一致 5> 形参的名称不能跟成员变量名一样 */- (void)setAge:(in
2016-10-25 14:56:17 257
原创 递归
递归的2个条件: 1.函数自己调用自己 2.必须有个明确的返回值练习:设计一个函数,用来计算b的n次方#include int pow2(int b, int n);int main(){ int c = pow2(3, 2); printf("%d\n", c); return 0;}//递归的方式int pow2(
2016-10-25 14:54:15 239
原创 指针
用指针交换两个参数的值:#include void swap(int *v1, int *v2);int main(){ /* int a = 10; int b = 11; swap(&a, &b); */ int a2 = 90; int b2 = 89; swap(&a2
2016-10-25 14:48:17 224
原创 数组
几种写法: int ages[5] = {10 , 11, 12, 67, 56}; int ages[5] = {10, 11}; int ages[5] = {[3] = 10, [4] = 11}; int ages[] = {10, 11, 14};int main(){ // 数组的定义格式: 类型 数组名[元素个数]; in
2016-10-25 14:47:03 215
原创 位运算符
按位与 &按位异或 ^ 1.相同数值进行异或,结果肯定是0,比如9^9 2.交换 9^5^6 == 9^6^5 3.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9 4.a^b^a == a^a^b == 0^b == b按位取反 ~ ~0000 0000 0000 0000 0000 0000 0000
2016-10-25 14:45:45 234
原创 for循环嵌套
提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推***************#include int main(){ // 1.定义一个变量存储用户输入的值 int n = 0; // 一定要初始化 // 2.判断n值合不合理 while (n <= 0) { //
2016-10-25 14:44:34 454
原创 for循环
for (语句1; 条件; 语句2) { 循环体 } 语句1:初始化语句 语句2:增量语句(执行完循环体后再执行的语句) 1.for一开始就会执行一次语句1(整个for循环只会执行一次) 2.判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立 #include int main(){ /
2016-10-25 14:43:27 274
原创 while循环
格式:while (条件) {循环体 }运行原理 1.如果一开始条件就不成立,永远不会执行循环体 2.如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立...... break 直接结束整个while循环 continue 结束当前的循环体,进入下一次循环体的执行int main(){ // 1.先确定需要重复执行
2016-10-25 14:42:11 433
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人