C Plu Plu 20170709 & 比较 , Time Profile 多用例讲解

中国上海,极客生涯: 一个开发者的 2018, 2019

总结 2018

技术进步:

做项目

涨知识,没有什么比来个难一点的任务,更快了。
为了解决他,又是翻书、又是 google , 有时候还发 stackOverFlow ,
寻找各种可能的技术,各种场景,综合记忆理解。
解决一个,对一类问题的解决套路印象,都挺深。
工程师,本来就是解决问题的。
做不出来,也别忘了他。说不定哪天,灵光一闪

项目简单,怎么办?
笔者 iOS ,用 Objective-C
需求容易实现,有时间做做代码优化,翻一下三方库源代码。

譬如:
AFN 的 AFURLSessionManager 文件中,有一个 _AFURLSessionTaskSwizzling 类。
他在 + load 中做了两个方法交换。
笔者的工程,用不到网络会话任务继续和网络会话任务挂起这两个通知,就把 _AFURLSessionTaskSwizzling 类的相关代码删了。
做启动时间优化的时候,翻到这里有一个 + load

又譬如:
SDW 的 https 挑战,笔者项目网络图片方面,不需要 ATS ,
就去掉了SDWebImageDownloaderOperation类和SDWebImageDownloader类 NSURLSessionTaskDelegate 的 ATS 方法- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler

不见得删了好,处理掉更加贴近自己的项目。
删了,可以让自己离底层近一点。
(笔者独立开发,有这个条件)
.....

写博客,下笔有益

写博客,写一下的好
笔者写博客中,发现
技术点,本来是很懵懂的,写着写着就通了一些。
写一下,既然自己是真的这样思考的,写下思路。
下次加载,就快了很多。
写博客的好处,就是不太会自欺欺人。
自己都骗不过去,蒙谁

( 后来又发现,文如其人哈。
知识点,东一下,下一下的。完全看心情 )

已经写了几篇,就把写给我自己看的完善和严谨化了一些,
有一些赞,挺高兴的。

感觉大体有两种写法:

第一种是 cookbook.
要做什么事情,( 需要一个长什么样的功能 ) ,
怎么设计的,( 弄几个概念出来 ),
怎么实现的,
写到这里,差不多原理和基本的 demo 都清楚了。
再处理一下异常情况和边界条件。
套路就是,为什么这样做,怎么做,需要什么

还有一种,感觉像是念经。
有什么东西,这些是做什么的,
东搞西搞,搞出来了。
( 在学校上课,这种情况,略常见一些 )

第一种,感觉比较友好,原理充沛一些,
需要准备的时间比较长,对技术点把握的比较好。

第二种,感觉仓促了一些。读起来滞涩。
比如,有博客里面的代码,不太好 run 起来。
看到了,也能感觉是这么个意思。

我努力加大第一种的比例,减少第二种的比例。

看博客,开卷有益

有公司的老法师说: "中文博客不要看,如果你不能分辨好坏"
很有道理,要学就学最强的。
英文资料大法好,可能英文技术世界积累深厚,现在发展的相当成熟了
( 不必要的事情,比较少 )

中文技术博客,发展中,完善中,有小坑
看了一些,感觉做好两点,即可

首先是,如果一个老法师说什么技术方向不可能,他往往是错的。如果一个老法师说什么技术方向是可能的,他往往是对的。
技术途径是丰富多彩的,编程语言本来就是人设计出来解决问题。
一般方法是很多的,取舍的余地比较大。

其次是,有博客中,有一种情绪。
( 常见的是 BS 新手,新手一般脾气高于技术。
线下操作,有一定的危险性。
本文建议尊重每一个人 )
取出我们关心的技术,就好了。老法师的世界,笔者是不怎么懂的

StackOverFlow

国内的,还有 segmentFault.
借别人的需求,磨练自己的技术。
回答出来一些别人的问题,对方采纳。笔者没能总结出来,什么规律。
感觉当时,有状态,有灵感
这几天,发现别人的需求,NaN

职业发展

每一份工作,一般都有困境期和舒适期。
困境期,各种展现价值,图表现,求生存。就是不断的拼命完成任务
舒适期,就是温水区,稳定下来了,升职又看不到光。
好一点的,会把舒适期转变为积累期,给自己持续的刺激,成长。

感觉进入了套路的轮回,温水中折腾,看到了社会上的能力似乎有成百成千种
笔者惨淡经营中,加薪靠跳槽

展望 2019

缺什么,就补什么。
想要什么,努力呗

技术和知识,不能用来改造自己,改变自己的生活,
技术世界,似乎没有了十二分的精彩

途径: 自求,才能多福

希望技术上,有大的突破,
写出来,分享出来,水到渠成的事

技术聚会

笔者参加技术聚会挺多的,
上海地区挺上档次的有,谷歌开发者日
感觉其宣讲的技术,有点着力于通俗易懂,传播福祉。
参加这个好,跟电影里面的一样,坚定了技术信念。
类似的技术主题聚会,有嘉宾主讲,去开拓下眼界,好
笔者,听了就忘。
惭愧惭愧
听多了,感觉冷静了很多。人外,人真多
推荐: 饿科技、携程技术(微信公众)

技术闲聊,有 Linux ,
参加了一下,好像不够大胆和进取
感觉反反复复那几句,很安全

另一半

现状,我妈强烈建议,我减肥,以免孤独一生
愿景: 情投意合,心心相印
有什么比两颗心,在一起,还要好。
女性本来就温柔、善良,唤醒她
物质,感觉似乎好像,不是很重要。
颜值,不需要。聪明,不需要。
正直,还有人喜欢,厉害了
真实,还不丑陋,强

认识大佬,感觉不怎么需要

大佬也不容易啊, ( 有写博客,求啊球 )
人家也是很努力,得来的。
大佬盛名之下,上面的那个老法师说: "没那么难"
羡慕人家吃鸡,不如自己努力
有幸认识了几位大佬,感觉生活中,普通人。
刚开始从众,后来自己的生活,都搞不定。
人家的私生活,
兴趣无、
群里看看消息,笔者就满足了
找大佬请教,
大佬博客写得好,先看十遍

关于标题:

上海地区的极客,就像江水里面的鲫鱼一样,数不胜数
希望多我一个

本文描述下: 一个普通的 iOS 开发者看到的,以及相关理解
偏见多,发小号
写了很多,阵痛的困惑

































技术聚会,
不够大胆

饿科技

github

另一半

我想要什么:

我的问题:
自卑, 不够自信。
自信从哪里来?

( 好丧。编理论精通 )

本文描述下,一个普通的 iOS 开发者看见的。
比较主观,有一定价值的偏见吧
希望成为更加的友好和开放,
共勉,amigo




























感觉从未真正活过: 普通 iOS 开发者的 2018 ,2019

感觉还未真正活过

分三个方面:
个人成长 ( 心智上 ),
技术进步 ( 写博客, stackOverFlow ),
职业发展

2018 写博客,
东一下,西一下

自卑,不够坚定
希望找到坚定不移的力量

如果知识和技能,不能改变自己的命运。
感觉,意思就少了一些

本文描述下: 还算年轻的邓不多,于寻找强大力量的旅途























































UICollectionView: 糊一张装饰视图 Decoration View 的一点经验

重点:

一,
装饰视图 Decoration View ,苹果的例子是一个 cell 贴一张背景图。
实际上,一个 section ,贴一张背景图,可以的。
苹果设计的非常灵活,基本上背景图想怎么糊上去,就怎么糊
实践中发现

二,
设置 Decoration View ,手写 UICollectionViewFlowLayout ( 或 UICollectionViewLayout ),是写死的。
布局显示,一般有一个网络请求。数据请求回来前,走自定义的 layout , 到具体的 indexpath, 访问手工设置有,因实际不存在,崩。
因为没有网络请求回数据,实际的 section 数量一般为 0.
需判断一下。

三,
无关 Decoration View 。
做了一个商品首页的需求,UICollectionView 七层楼,每层楼都不一定有,楼层顺序也不一定。
如果写 if else ,就要命。通过字典配置,解决了。


详细介绍:

第一点,一个 section ,贴一张背景图
设置背景图的区域,糊上去,end

具体烹饪教程如下:

装饰视图是 UICollectionViewLayout 的功能,不是 UICollectionView 的。
UICollectionView 的方法、代理方法 (delegate, datasource)都不涉及装饰视图。
UICollectionView 对装饰视图一无所知,UICollectionView 按照 UICollectionViewLayout 设置的渲染。

要用装饰视图,就要自定制 UICollectionViewLayout,也就是 UICollectionViewLayout 的子类。这个 UICollectionViewLayout 子类,可以添加属性、代理属性,通过设置代理协议方法,来自定制装饰视图。

本文 Demo 举的例子是添加一个装饰视图背景图片。
(没有涉及使用代理,设置协议方法,进一步控制装饰视图)

简要说来,自定制的 layout 子类,实现一个装饰视图,五步:

步骤 1,
要有 Decoration View 文件。
先创建一个 UICollectionResuableView 的子类, 这个就是具体的装饰视图

@interface FrontDecorationReusableView()
// 装饰视图,里面就一张图片
@property (nonatomic, strong) UIImageView * imageView;

@end

@implementation FrontDecorationReusableView
- (instancetype)initWithFrame:(CGRect)frame{

    if (self = [super initWithFrame:frame]){ 
        self.backgroundColor = UIColor.whiteColor;
        _imageView = [[UIImageView alloc] init];
        [self addSubview: _imageView];
        // 使用了 masonry 布局
        [_imageView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.mas_equalTo(self);
        }];
    }
    return self;
}

步骤 2,
layout 中注册装饰视图。
有了装饰视图,组装在一起 (wire it up)
自定制的 layout 子类中,注册 UICollectionResuableView 的子类,也就是装饰视图。
调用 - (void)registerClass:(nullable Class)viewClass forDecorationViewOfKind:(NSString *)elementKind; 方法。
一般在 - (void)prepareLayout 方法中注册。

- (void)prepareLayout {
    [super prepareLayout];
    [self registerClass: FrontDecorationReusableView.class forDecorationViewOfKind: FDRFrontDecorationReusableView];
}

步骤 3,
设置装饰视图的位置。
- (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath 方法,设置装饰视图 UICollectionResuableView 的位置,因为该方法返回了装饰视图的布局属性。
+ (instancetype)layoutAttributesForDecorationViewOfKind:(NSString *)decorationViewKind withIndexPath:(NSIndexPath *)indexPath; 方法,构建布局属性,并作相关的配置。

先设置装饰视图的具体位置,

- (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath{
    
    if (elementKind == FDRFrontDecorationReusableView && indexPath.section == 1) {
        DecorationLayoutAttributes * attributes = [DecorationLayoutAttributes layoutAttributesForDecorationViewOfKind: FDRFrontDecorationReusableView withIndexPath: indexPath];
        // 通过属性,外部设置装饰视图的实际图片 ( 后有介绍 )
        attributes.imgUrlStr = self.imgUrlString;
       // 这里,装饰视图的位置是固定的
        CGFloat heightOffset = 16;
        attributes.frame = CGRectMake(0, KScreenWidth * 0.5 - heightOffset, KScreenWidth, 102 + heightOffset);
        attributes.zIndex -= 1;
        return attributes;
    }
    return nil;
}

步骤 4,
重写 - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect 方法,
该方法会返回给定区域内,所有视图 ( 格子视图、补充视图(header \ footer)、装饰视图 ) 的布局属性。
这里要糊上装饰视图,layoutAttributesForElementsInRect:返回的布局属性数组,需含有调用 - (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath 方法中设置的布局属性。

这一步比较关键,collectionView 得到了足够的信息,显示装饰视图。
当 collectionView 调用 layoutAttributesForElementsInRect:,他会提供每一种装饰视图的布局属性。
collectionView 对装饰视图是隔离的,一无所知。看到的 collectionView 的装饰视图,是自定制 layout 提供的。
步骤 2中,注册了装饰视图,即创建了自定制的装饰视图实例。collectionView 会根据布局属性,放置好。

把上一步设置的装饰视图布局属性,交给 collectionView 使用

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
    NSArray<UICollectionViewLayoutAttributes *> * rawArr = [super layoutAttributesForElementsInRect: rect];
    NSMutableArray<UICollectionViewLayoutAttributes *> * array = [[NSMutableArray alloc] initWithArray: rawArr];
// 避免崩溃 ( 后有介绍 )
    NSInteger numberOfSections = [self.collectionView numberOfSections];
    if (numberOfSections == 0) {
        return rawArr;
    }
    UICollectionViewLayoutAttributes * decorationAttrs = [self layoutAttributesForDecorationViewOfKind: FDRFrontDecorationReusableView atIndexPath: [NSIndexPath indexPathForItem: 0 inSection: 1 ]];
    if (decorationAttrs && CGRectIntersectsRect(rect, decorationAttrs.frame)) {
        [array addObject: decorationAttrs];
    }
    return [array copy];
}


步骤 5,
怎么给装饰视图传值?
三步走:
CollcetionView -> layout -> layoutAttributes -> decorationView 装饰视图
本文 demo ,是配置具体的装饰图片。

先给自定制的 layout 一个图片地址属性,

@interface DecorationFlowLayout : UICollectionViewFlowLayout
@property (nonatomic, copy) NSString * imgUrlString;
@end

然后想办法传过去,就好了
collectionView 设置 layout 的图片 url ,间接控制装饰视图的图片 url

......
self.decorationFlowLayout.imgUrlString = @"https://fscdn.zto.com/GetPublicFile/ztPK4Y-WGgWKiRNfkygd3oYQ/thumbnail_747d31f481044bf6a149c7483cd097a5.jpg";
    [self.newMainCollectionView reloadData];
}

自定制 layout 与装饰视图也是隔离的。创建自定制布局属性对象 UICollectionViewLayoutAttributes 来传值,相当于找了一个信使。
使用 UICollectionViewLayoutAttributes 的子类,添加属性传值。

@interface DecorationLayoutAttributes: UICollectionViewLayoutAttributes

@property (nonatomic, copy) NSString * imgUrlStr;
@end

layoutAttributesForDecorationViewOfKind: 中配置,
上有提及,

DecorationLayoutAttributes * attributes = [DecorationLayoutAttributes layoutAttributesForDecorationViewOfKind: FDRFrontDecorationReusableView withIndexPath: indexPath];
        // 通过属性,外部设置装饰视图的实际图片
        attributes.imgUrlStr = self.imgUrlString;

最后一小步,
把自定制 LayoutAttributes 的图片 url 传递给装饰视图, 靠 - (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes 方法。
当 collectionView 配置装饰视图的时候,会调用该方法。layoutAttributes 作为参数,取出 imgUrlStr 属性使用,就可以了

- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes{
    if ( [layoutAttributes valueForKey: @"imgUrlStr"] && [layoutAttributes isMemberOfClass: NSClassFromString(@"DecorationLayoutAttributes")] ) {
        [self.imageView sd_setImageWithURL_str: [layoutAttributes valueForKey: @"imgUrlStr"]];
    }
}


第二点,怎么处理,看了一下大神写的 CHTCollectionViewWaterfallLayout

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
    NSArray<UICollectionViewLayoutAttributes *> * rawArr = [super layoutAttributesForElementsInRect: rect];
    NSMutableArray<UICollectionViewLayoutAttributes *> * array = [[NSMutableArray alloc] initWithArray: rawArr];
    NSInteger numberOfSections = [self.collectionView numberOfSections];
//    if (numberOfSections == 0) {
//        return rawArr;
//    }
UICollectionViewLayoutAttributes * decorationAttrs = [self layoutAttributesForDecorationViewOfKind: FDRFrontDecorationReusableView atIndexPath: [NSIndexPath indexPathForItem: 0 inSection: 1 ]];

// 因为这一行,崩
// 数据请求回来前,不存在实际的区间。 indexPath 也没有。

2019-01-05 16:54:59.230718+0800 Improved[31532:238435] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for layout attributes for decoration view of kind FrontDecorationReusableView in section 1 when there are only 0 sections in the collection view'

datasource 数据源没设置,就先返回
判断一下情况

 if (numberOfSections == 0) {
        return rawArr;
    }


第三点,
if 直接判断条件,有一个随机的语义。
字典就是哈希表,知道键,直接取值。也有一个随机的语义。
正适合这种随机配置的情况。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
// 最后一层楼,固定的情况, 简单点, 还是用 if 了
   if( indexPath.section == self.floorDataLists.count ){
        HotSalesCell * hotSaleCollectionViewCell = [collectionView dequeueReusableCellWithReuseIdentifier: kHotSaleCollectionViewCell forIndexPath: indexPath];
        MyProduct * myProduct = self.hotSaleProducts[indexPath.row];
       hotSaleCollectionViewCell.hotSalesProduct = myProduct;
       return hotSaleCollectionViewCell;
   }
   UICollectionViewCell * cell = nil;
   
   FloorDataList * floorDataList = self.floorDataLists[indexPath.section];
   NSString * keyStr = floorDataList.floorTypeName;
// 先找出,关键的楼层配置信息, 作为键
   NSNumber * newSectionIndex = self.mapOne_sequence[keyStr];
// 先使用字典,化无序的配置,为有限的集合情况
// 使用 switch ... case  , 对每一种情况,针对性处理就好了
   FloorDataModel * floorDataModel = floorDataList.floorData[indexPath.item];
   switch (newSectionIndex.unsignedIntegerValue){
       case 1:
       {
           BannerReusableView * bannerReusableView = [collectionView dequeueReusableCellWithReuseIdentifier:  kBannerReusableView forIndexPath: indexPath];
               NSMutableArray * imgLinksArray = [NSMutableArray array];
               for (FloorDataModel * floorDataModel in floorDataList.floorData){
                   [imgLinksArray addObject: floorDataModel.uploadImage];
               }
               [bannerReusableView parseBannerPics: imgLinksArray  andSection: indexPath.section];
           }
           / / Cell A 
           cell = bannerReusableView;
       }
           break;
       case 2:
           {
               cell = // ... Cell B; 
           }
           break;
       case 3:
           {
                cell = // ... Cell C; 
           }
           break;
       case 4:
       {
            cell = // ... Cell D; 
       }
           break;
       default:
           break;
   }
   return cell;
}


- (NSDictionary *)mapOne_sequence{
   if (!_mapOne_sequence) {
       _mapOne_sequence = @{kFloorTypeNameFiveIcon: @(2),
                   kFloorTypeNameBanner: @(1),
                   kTenGoods: @(3),
                   kAcrossColumn: @(4)
                   };
   }
   return _mapOne_sequence;
}


先找出,关键的楼层配置信息, 作为键
使用字典,化无序的配置,为有限的集合情况
使用 switch ... case , 对每一种情况,针对性处理就好了
(暂未想出更好的办法)
更多见 Demo 代码:

https://dev.tencent.com/u/dengjiangzhou/p/Obj_C_launch/git

参考了下 casa 大佬写过的一篇博客


参考资料:

https://stackoverflow.com/questions/12810628/uicollectionview-decoration-view


































加码版: AFN 使用姿势错误, 引起的 Retain Cycle


网络相关的 Retain Cycle 分析,AFN 使用姿势错误 @ 青浦区,乡亲们


接手过几个项目,网络库都是这么封装的,

一个类方法把 AFN 实例化,算是封装
写一排排类方法, 对应业务逻辑

先设置通用的请求头,简单封装参数,

@implementation NetManager
//  配置请求头 token、时间戳... ,经过了适当的简化
+ (AFHTTPSessionManager *)shareAFManager{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    [manager.requestSerializer setTimeoutInterval: TimeoutInterval];
    //去除网络返回的null
    AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
    response.removesKeysWithNullValues = YES;
    manager.responseSerializer = response;

    // Header
    NSString *access_token =  [[CacheManager sharedInstance] getToken];
    [manager.requestSerializer setValue:access_token forHTTPHeaderField:@"TOKEN"];
    [manager.requestSerializer setValue:@"ios" forHTTPHeaderField:@"PLATFORM"];
    [manager.requestSerializer setValue: @"拿时间" forHTTPHeaderField:@"TIMESTAMP"];
    [manager.requestSerializer setValue: @"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    return manager;
}

做事情,配置请求体,业务参数,调用 AFN 请求数据


@implementation HttpRequestManager

#pragma mark --  baseRequest

+ (void)baseNetWorkType:(NSString *)msg_type
                version:(NSString *)version
               dataDict:(NSDictionary *)dataDict
              isEncrypt:(BOOL)encrypt
                success:(SuccessBlock)success
                failure:(FailureBlock)failure
{

    AFHTTPSessionManager *manager = [NetManager shareAFManager];
    [manager.requestSerializer setValue:msg_type forHTTPHeaderField:@"METHOD"];
    //设置请求体数据
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    NSString *dataStr = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:dataDict options:0 error:nil] encoding:NSUTF8StringEncoding];
    if (encrypt) {
        // ... 
        //  处理 dataStr
        //  做一些 MD5 加盐签名的事情
    }
    [dict setValue:dataStr forKey:@"data"];
    [dict setValue:version forKey:@"version"];
    [dict setValue: @"参数信息摘要" forKey:@"digest"];
    // 召唤 AFN
    [manager POST: @"http://www.baidu.com" parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *responseDict = (NSDictionary *)responseObject;
        NSString *responseMessage = [responseDict valueForKey:@"msg"];
        NSString *statusCode = [responseDict valueForKey:@"code"];
        NSString *responseData = [responseDict valueForKey:@"data"];
        if ([statusCode isEqualToString: @"200"]) {
            success(responseDict,responseData,responseMessage);
        }  else{
            failure(statusCode,responseMessage);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        failure(@"-1", @"666666");
    }];
}

做业务

/*   业务逻辑 */
#pragma mark -- 请求数据
+ (void)queryDataParams:(NSDictionary *)params success:(SuccessBlock)success
                  failure:(FailureBlock)failure{
    
    [HttpRequestManager baseNetWorkType: @"请求数据" version: 2.0 dataDict:params isEncrypt:NO success:^(id response, id data, NSString *Message) {
        success(response,data,Message);
    } failure:^(NSString *statusCode, NSString *Message) {
        failure(statusCode,Message);
    }];
}
// ......
// 还有一排一排的类方法,做业务的很多

简单的配置了一下属性,没做什么事情,
也就是语法糖,

然后内存泻的飞快

0

使用 Xcode 的调试计量,可以清楚看见。点一下内存对象关联图,就可。


因为存在循环引用。

AFHTTPSessionManager 与 __NSURLSessionLocal 之间的相互强引用


因为网络处理有一些特殊地方,

这样写相当于,管分配对象内存,不管释放,有一些尾大不掉的感觉



mattt 大神是这么说的:

NSURLSession 保留了他的代理
(也就是说 AFURLSessionManager).

调用 AFN 的 invalidateSessionCancelingTasks: 方法,就可以确保网络会话结束,就释放了他们的代理对象。

参考自 AFN issue #2149

顺着 mattt 的链接,就是苹果文档 URLSession Document.
苹果文档在使用网络会话的代理中 (Using a Session Delegate),特意注明了:


知道存在,内存漏的飞快,用户日活成百上千的情况。

memory footprint 不佳,似乎也没什么。

程序一般也不会变慢。

内存问题,程序崩的,遇见的也挺少。


写在最后,本文需要吐下槽

先甩锅。

敬仰 SH iOS 工程师王大宇,

老王做了个梦,

老王猜,可能对于一般的团队,
系统的内存当然是,想怎么用怎么用,真不用花钱。
一般情况下, 技术小组长,技术负责人,产品负责人,谁关心这个

老王想,写在最后,不然看的...

产品负责人关心的是产品体验,崩溃率, 用 bugly , 性能( 卡顿,界面卡不卡 , 接入听云, 啥啥啥、 产品运营 (PV / UV, 项目指标用友盟 )

提高对内存的理解,app 的开发掌控的好一点





























修改源码,讲个故事,YYModel 做梦都要哔哔




先读一下语义


YYModel 非常优秀,本文没发现有改进的地方,

改动一下,贴近所做的项目。


怎么说,网上博客那么多
讲个故事

做梦开始








醒来啦


















僵尸对象

等内存错误















































































































































友元

private :
    double re, im ;
    friend Complex& __doap(Complex * , const Complex& );
//报错, 这里缺一字符doapl, 要细心
inline Complex&
__doapl (Complex * ths , const Complex& r){
    ths->re += r.re;
    ths->im += r.im;
    return *ths;
    
}



比较 日期

之前的, 忽略了一种 很明显的 情况,还以为 系统出错。 好尴尬呀。
C++. 是一门 非常优秀的语言。

bool
__compareValue (const Date& lhs, const Date& rhs){
    bool isDateOver = lhs.dayValue() > rhs.dayValue() ? true : false;
    bool isMonthOver = lhs.monthValue() > rhs.monthValue() ? true : (lhs.monthValue() < rhs.monthValue()? false:isDateOver);
    bool isOver = lhs.yearValue() > rhs.yearValue()? true : (lhs.yearValue() < rhs.yearValue()? false: isMonthOver) ;
    return isOver;
}



之前的:

bool
__compareValue (const Date& lhs, const Date& rhs){
  if(lhs.yearValue() > rhs.yearValue()){
        return true;
    }else if( lhs.monthValue() > rhs.monthValue()){
        return true;
    }else if(lhs.dayValue() > rhs.dayValue()){
        return  true;
    }else{
        return false;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容