我正在使用的ios库系列之Mantle


<!–markdown–>#什么是Mantle
Mantle是由于Github团队开发的,目的是去除Objective-C把JSON数据转为NSObject子类的所有样板代码。Mantle也能做数据转换,通过一种神奇的方式把JSON原始数据(strings, ints, floats)转换为复杂数据,比如NSDate, NSURL, 甚至是自定义类。

#Github地址
https://github.com/Mantle/Mantle

#令人(我)兴奋的功能

1.绑定JSON(dict,class)数据

<p><!–more–></p>
只要在model类里实现 JSONKeyPathsByPropertyKey.你就可以实现将model类里的属性与JSON或dict里的任意路径的节点绑定,如下代码

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
             @&#34;date&#34;: @&#34;dt&#34;,
             @&#34;windSpeed&#34;: @&#34;wind.speed&#34;,
             };
}

2.JSON数据的转换

想像一下,服务端返回给我们一串图片url,我们只需要实现一个公式,Mantle就会自动将url转换成uiimage.

以后,我们使用 这个model类的时候就只要 model.image就可以得到一个uiimage图片,是不是很酷?实现代码如下

方法名约定为 + (NSValueTransformer *)属性名JSONTransformer
然后调用MTLValueTransformer ,实现双向转换即可

  + (NSValueTransformer *)iconJSONTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *value) {
        return [UIimage initWithURl:value];
    } reverseBlock:^(UIImage *img) {
        return [uiimage geturl];
    }];
}

或者,直接实现单向转换

+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key {
    if ([key isEqualToString:@&#34;createdAt&#34;]) {
        return [NSValueTransformer valueTransformerForName:XYDateValueTransformerName];
    }

    return nil;
}

3.classForParsingJSONDictionary
从json,dictionry解析出class?没用过。。。官方API
If you are implementing a class cluster, implement this optional method to determine which subclass of your base class should be used when deserializing an object from JSON.
这是从json中确定哪个子类?

+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary {
    if (JSONDictionary[@&#34;image_url&#34;] != nil) {
        return XYPictureMessage.class;
    }

    if (JSONDictionary[@&#34;body&#34;] != nil) {
        return XYTextMessage.class;
    }

    NSAssert(NO, @&#34;No matching class for the JSON dictionary &#39;%@&#39;.&#34;, JSONDictionary);
    return self;
}

analyze工具问题汇总


<!–markdown–>#头等席:potential leak of an object
潜在的泄漏对象.
1.在某些情况下,发生内存汇漏。至于是什么情况下?analyze会告诉你并复现。

#value stored to'xxx' is never read.
数据值(变量名?)从没读过。
1.定义了变量名,从未使用过
2.变量在最后一次更改值之后,没有被使用过.如{int a=b=1;a=b+1;nslog(a);nslog(b);a=a+b;}
<p><!–more–></p>

#value stored to 'xxx' druing its initalization is never read

数据值(变量名?)从定义起从没读过.好像和上面的一样,一般出现在对象init时没有添加 autorelase.比如
        NSArray *ary=[[NSArray alloc]init];
                ary=我是另一个NSArray;
这样子alloc开辟出来的内存空间就浪费了,就出错了。

#the left operand of 'x' is a garbage value
操作符的左右是垃圾值?一般是操作符的一边可能存在nil或者空值。比如
char a[12];
if(a[1]==3)
a[1]没有赋值,就是无意义比较的垃圾值.

IOS 里的一些小玩意和细节


<!–markdown–>#EdgeInsets

API文档对其的描述是:
// specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
渣翻:指定一定数量的偏移,到容器的边缘,值可以是为负值。
类似于 css中的 padding,却又比padding强大得多,利用他可以给button作一些神奇的布局,可惜目前我只在uibutton上看到过。
妖寿啦~图片出来啦
<p><!–more–></p>

#关于NSSet 和NSOrderSet

NSSet是个不可变无序的唯一的对象集合,这里的唯一比较基于值,而非内存地址,很好奇内部是如何实现两个对象快速比较值。

最大的优点: 速度比nsarray快得快, 类似于hash.

NSOrderSet 是NSSet 和NSArray的集合体,他可以使用objectAtIndex之类的方法,但是子对象依然要求唯一。

官方说 NSOrderSet拥有比NSSet还要快的性能(变态...),但是我个人测试了一下,100W条简单对象(1-100W,字符对象)的情况下,取10次平均值,环境是虚拟机。
    NSOrderSet 拥有 比NSSet快得快的多的遍历速度。 平均 NSOrderSet3倍于NSset
    NSOrderSet的添加子对象速度要稍慢于NSset,大约是130~150%左右。

#关于UIWebView加载内容不释放内存

UIWebView使用loadRequest 加载内容时经常会造成内存无法释放,即使UIWebView自身已经销毁或者重新load一个空的内容进去。

只要使用 loadData 方法就能解决上面这个问题,在不需要用到这个内容的时候将NSData=nil.然后uiwebView loadHTMLString @""空内容,就可以马上清空掉所占内容,在data=nil的瞬间。<font color='red'>我果然很聪明</font>

#UIWebView滚动时隐藏头部和脚部黑块

UIwebView在滚动时在顶部和脚部会有一块 黑色渐变矩形,显得巨丑。在ios7以后可以通过设置uiwebView.backgroundColor或uiwebView.scrollView.backgroundColor设置背景色遮盖。在ios7以下版本可以通过添加像 uitableView 类似的 上拉刷新View,和下拉刷新View这种方式来隐藏.但是,添加底部的空白view时,我们需要知道内容页的高度,所以只能在UIwebView didLoadFinsh 时通过javascript脚本去获取高度之后再设置 底部的空白view

NSString *height_str= [webView stringByEvaluatingJavaScriptFromString: @&#34;document.body.offsetHeight&#34;];
    int height1 = [height_str intValue]+17;
    //在ios7以下版本中,无法通过设置 webView.backgroundColor 或 webView.scrollView.backgroundColor 来盖掉背后的黑乎乎,通过添加
    // ’上拉刷新‘ 和‘下拉刷新’ view 来解决这个问题
    if(ISNOTIOS7){
        UIView *headerView=[[UIView alloc] initWithFrame:CGRectMake(0,0-height1, webView.bounds.size.width, height1)];

        headerView.backgroundColor=[UIColor whiteColor];

        UIView *footerView=[[UIView alloc] initWithFrame:CGRectMake(0,height1, webView.bounds.size.width,height1)];

        footerView.backgroundColor=[UIColor whiteColor];

        [webView.scrollView addSubview:headerView];

        [webView.scrollView addSubview:footerView];

    }

#关于Xcode显示空格字符解决方案

在安装了新版的xcode之后,发现代码区出现了很多锯齿状的空格符号,如下图:
QQ截图20140530095255.png
十分烦,解决方案:Editor–> Hide Invisibles

#关于 CocoaPods慢的问题

使用 pod install --verbose --no-repo-update 可以缓解一下,比 pod install 要快些