ZCLemo的学习领域

有时候,静下心来学习是一种享受!


  • 首页

  • 归档

  • 关于

  • 标签

给类别添加属性

发表于 2016-09-26   |  

当向类别中添加自定义属性时会报instance variables may not be placed in categories错误,还好我们有了runtime,我们可以通过runtime的Associate为类别添加属性

1
2
3
4
5
@interface UIView (LFEaseBlankPageView)
{
NSString *test;/*报错instance variables may not be placed in categories */
}
@end

正确做法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

static char BlankPageViewKey;

- (void)setBlankPageView:(LFEaseBlankPageView *)blankPageView{
[self willChangeValueForKey:@"BlankPageViewKey"];
objc_setAssociatedObject(self, &BlankPageViewKey,
blankPageView,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self didChangeValueForKey:@"BlankPageViewKey"];
}

- (LFEaseBlankPageView *)blankPageView{
return objc_getAssociatedObject(self, &BlankPageViewKey);
}

iOS const,static,extern关键字的使用

发表于 2016-07-19   |  

主要介绍const,static,extern关键字的使用

1.const与宏的区别

1.1 宏在预编译时处理,const会在编译时被处理
1.2 宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误
1.3 宏的好处:宏能定义一些函数,方法。 const不能;使用大量宏,容易造成编译时间久,每次都需要重新替换

2.const的作用

2.1 const仅仅用来修饰右边的变量
2.2 被const修饰的变量是只读的
2.3 const简单使用
1
2
3
4
5
6
NSString *const MC_MYCOUPON_STORAGE = @"CouponStorage";
- (void)viewDidLoad {
[super viewDidLoad];
//这里修改会报错,MC_MYCOUPON_STORAGE不能被修改
MC_MYCOUPON_STORAGE = @"test";
}

3.static的作用

3.1 延长局部变量的生命周期,程序结束才会销毁
3.2 局部变量只会生成一份内存,只会初始化一次
3.3 改变局部变量的作用域
3.4 只能在本文件中访问,修改全局变量的作用域,生命周期不会改
3.5 避免重复定义全局变量

4.extern的作用

4.1 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
4.2 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;

// static修饰全局变量
static int age = 20;

- (void)test
{
// static修饰局部变量
static int age = 0;
age++;
NSLog(@"%d",age);
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.


[self test];
[self test];

extern int age;
NSLog(@"%d",age);
}

5.static与const联合使用

5.1 static与const作用:声明一个只读的静态变量
5.2 开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合

6.extern与const联合使用

5.1 多个文件中经常使用的同一个字符串常量,可以使用extern与const组合
5.2 extern与const组合:只需要定义一份全局变量,多个文件共享

改变webview加载页面的字体大小

发表于 2016-06-28   |  

修改字体大小很简单,用到了js

1
2
3
4
5
- (IBAction)changeFont:(id)sender {

NSString* str1 =[NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%f%%'",20.0];
[_webView stringByEvaluatingJavaScriptFromString:str1];
}

沙盒路径

发表于 2016-05-26   |  

在平时的开发中,我们经常和沙盒打交道,可能平时并不会过多关注沙盒路径下一些文件夹的区别和作用,今天我自己做了一个总结。

1.进入沙盒路径我们会看到Documents,Library,tmp三个文件夹,我们会看到如下图:

img

Library文件夹下有Caches和Prefereneces两个文件夹:如下图:

img

1.1 Documents 存放用户文档和应用数据文件,打个比方:如果你做个记事本的app,那么用户写了东西,总要把东西存起来。那么这个文件则是用户自行生成的,就放在Documents文件夹里面。而且会被iTunes同步。
1.2 Library 应用程序规范的顶级目录,下面有一些规范定义的的子目录,当然也可以自定义子目录,用于存放应用的文件,但是不宜存放用户数据文件;如果你有一个app,需要和服务器配合,经常从服务器下载东西,展示给用户看。那么这些下载下来的东西就放在Cache路径下,Prefereneces一般很少会用到。Cache不会被iTunes同步,Prefereneces会被iTunes同步。
1.3 tmp 沙盒临时目录,app退出,或程序切后台后会被删除

2.下面是获取各个文件夹路径的方法:

2.1 获取Documents文件夹路径:
1
2
3
4
5
+ (NSString *)libraryPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}
2.2 获取Cache文件夹路径:
1
2
3
4
5
+ (NSString *)cachePath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}
2.3 获取tmp文件夹路径:
1
2
3
4
+ (NSString *)tmpPath
{
return NSTemporaryDirectory();
}

svn lock问题

发表于 2016-05-24   |  

由于上次用svn check out 的时候中途断网了,然后口来每次Update 或 Commit 的时候都提示svn lock ,后来在网上找了好多办法都不行,最后发现通过终端在该文件路径下,执行以下SVN cleanup就行了。吐血。。。

block中调用对象的实例变量导致循环引用

发表于 2016-05-17   |  

今天在重构公司以前的代码时,由于公司的需求,当从一个当前页面退出时,要终止该页面的所有网络请求。于是我在dealloc中添加了取消网络请求的方法,但在实际的操作中却发现,dealloc方法在退出页面时被没有被调用,而是等到了网络请求结束后才会调用。然后我想到了应该是网络请求中block的循环引用。最后我发现公司以前的对象都是实例变量,也就是下划线的这种形式。比如:

1
2
3
4
@interface TestVC (){
BOOL _isToOuter;
}
@end

这就导致了循环引用的问题。然后我就把实例变量都改成了属性的形式,再加上了

1
__weak typeof(self) weakSelf = self;

解决了问题,然后我在想能不能就用实例变量来解决这个问题,然后我在网上查了方法,找到了可行的办法,如下:

1
2
3
4
5
6
7
8
9
10
11
-(void)test{
NeedABlockObj* obj=[[NeedABlockObj alloc] init];

__typeof (&*self) __weak weakSelf = self;
obj.aBlock = ^(int to){
//不把weak 转为strong,则无法编译通过。
__typeof (&*self) strongSelf = weakSelf;

strongSelf->_isToOuter = YES;
};
}

这种方法虽然也能解决问题,但是strongSelf->这种风格在OC中很少见,是C++的引用风格,所以我想了想还是放弃了这种方式,全部改为属性,虽然麻烦了点,看看后续还能不能找到更好的方法来解决。

一些常用的正则表达式

发表于 2016-05-16   |  

在平时的开发中,一些常用的正则表达式能大大提高你的开发效率,一下是我平时的一些收集。

1.检验密码强度,密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间;

1
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

2.检验中文,字符串仅能是中文;

1
^[\u4e00-\u9fa5]{0,}$

3.由数字、26个英文字母或下划线组成的字符串;

1
^\w+$

4.检验E-Mail地址

1
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

5.检验身份证号码;

15位:
1
^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
18位:
1
^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$

6.检验日期,”yyyy-mm-dd”格式的日期校验,已考虑平闰年;

1
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

7.检验金额,金额校验,精确到2位小数;

1
^[0-9]+(.[0-9]{2})?$

8.检验手机号,下面是国内13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码);

1
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

9.判断IE版本

1
^.*MSIE[5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$

10.检查URL的前缀,请求是HTTPS还是HTTP;

1
2
3
4
if(!s.match(/^[a-zA-Z]+:\/\//))
{
s='http://'+s;
}

11.提取URL链接,下面的这个表达式可以筛选出一段文本中的URL;

1
^(f|ht){1}(tp|tps):\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?

Button的Touch事件

发表于 2016-04-25   |  

在我们平时的学习中和项目中,给UIButton添加点击事件我们绝大部分只用到了UIControlEventTouchUpInside ,最近在做一个项目时,里面用到了语音聊天,用一个Button完成了语音的录制。刚开始我的想法是给一个View加上一个LongPress手势。后来借鉴了别人的Demo,发现可以用一个Button的各种处理事件来完成。于是我对Button的Touch事件重新研究了一下,以下是我的记录!

1.UIControlEventTouchDown,在鼠标或者手指点击Button时触发.

2.UIControlEventTouchDownRepeat,指鼠标左键或手指连续多次重复按下(注:只是“按下”)的动作,比如,鼠标连续双击、三击、……、多次连击时触发。

3.UIControlEventTouchDragInside,指按下鼠标或手指,然后在控件边界范围内拖动。

4.UIControlEventTouchDragOutside,与UIControlEventTouchDragInside不同的是,拖动时,鼠标位于控件边界范围之外。但首先得有个UIControlEventTouchDown事件,然后接一个UIControlEventTouchDragInside事件,再接一个UIControlEventTouchDragExit事件,这时,鼠标已经位于控件外了,继续拖动就是UIControlEventTouchDragOutside事件了。

5. UIControlEventTouchDragEnter,指拖动动作中,从控件边界外到内时产生的事件。

6.UIControlEventTouchDragExit,指拖动动作中,从控件边界内到外时产生的事件。

7.UIControlEventTouchUpInside,指鼠标和手指在控件范围内抬起。

8.UIControlEventTouchUpOutside,指鼠标在控件边界范围外抬起.

插件失效管理办法

发表于 2016-04-21   |  

当我们升级Xcode的时候,会经常遇到插件失效的问题,下面给出了解决方案。

第一步:打开终端,输入以下命令:

1
$ defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

第二步:获取到DVTPlugInCompatibilityUUID,然后

1
$ find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add 9F75337B-21B4-4ADC-B558-F9CADF7073A7

第三步:详细见下图:

img

First Page

发表于 2016-04-20   |  

我的第一篇博客,Fighting!

12
赵琛

赵琛

我是赵琛,一名iOS开发工程师!我的邮箱18356033655@163.com

20 日志
2 标签
© 2017 赵琛
由 Hexo 强力驱动
主题 - NexT.Pisces