iOS开发笔记(六)

前言

专注、坚持,是优良的品格。

正文

1、cell和cell.contentView 的区别

在给UITableViewCell添加视图的时候,我们有以下两种做法:

  • [cell addSubview: subView]
  • [cell.contentView addSubview: subView]

有何不同? 先看看以下两个tableView模式的视图结构:

正常模式

编辑模式

[cell addSubview: subView]添加的subView,不会随着模式改变而改变位置;

2、Block修改外部变量

先看看一段简单的代码,看看NSLog会输出什么?代码是否存在问题?

typedef void(^TestBlock)();
@implementation ViewController {
    int a;
    NSString *b;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    a = 0;
    b = @"0";
    int c = 0;
    TestBlock block = ^() {
        a = 100;
        b = @"100";
        c = 100;
    };
    block();
    NSLog(@"%d %@ %d", a, b, c);
}

问题1:在Block中修改栈内临时变量,需要添加__block关键字声明; 问题2:在Block中修改@implementation 中声明的属性变量,也需要添加Weak-Strong的声明;

Block的执行时机未定,所以无法直接修改栈内临时变量;如果发现在栈外调用,会触发指针异常;故而需要添加__block声明,使用时把变量copy到堆上; 同理,Block可能会在VC的声明周期之外执行,所以需要在block外面添加weakSelf的声明,避免Block强引用self导致VC无法回收;同时在Block内部添加StrongSelf的声明,避免Block在执行过程中VC被回收;

在Block内外添加NSLog(@"%p %p %p", &a, &b, &c);,可以而查看调用前后的地址变化; 如果还想深入了解,可以入手一本《Objective-C高级编程 iOS与OS X多线程和内存管理》

3、多参数方法的调用

通过performSelector无法调用一个多参数的方法,可以使用NSInvocation。 首先通过instanceMethodSignatureForSelector获取NSMethodSignature,再通过invocationWithMethodSignature新建NSInvocation,最后设置好target和selector以及参数数组,最后调用invoke。

You should use the invocationWithMethodSignature: class method to create NSInvocation objects; you should not create these objects using alloc and init. 不会对参数进行retain操作,开发者要保证调用期间的参数生命周期。

这种调用方式比较复杂,如果能修改被调用的方法,可以采用把参数设置成NSDictionary或者自定义的数据结构体;也可以把方法的调用采用Block的方式。

4、Xcode 无法在Debug中输出变量信息

Xcode在真机调试时,无法通过LLDB指令打印变量信息,得到的错误信息是: Errored out in Execute, couldn't PrepareToExecuteJITExpression

  • 可能1、工程编译目标类型是release而不是debug,在target设置中改为debug;
  • 可能2、Xcode和iOS版本不一致,对齐版本;
  • 可能3、系统问题,重启电脑和iOS;
  • 可能4、打开schemes,Run选项,关闭Address Sanitizer;

5、Xcode 内存暴涨

Xcode8内存占用暴涨到60G,同时SVN占用7G多;

这个状况在今年使用SVN同步代码之后首次出现,因为SVN拉取最新的代码后Xcode会进行Index操作,怀疑是svn进程异常导致Xcode的Index逻辑异常。 在GG上查找多次,没有找到类似的问题的解决方案。 最后自己的解决办法是:打开Xcode的偏好设置,选择Account,删除Repo下面的svn库,命令行执行一遍svn cleanup,重新添加svn的Repo。

6、Core Data 真机数据查看

工作需要,想查看真机上面的CoreData的数据库数据。 真机联Xcode,打开Xcode的Devices(Shift+Command+2),下载对应App的沙盒数据。找到CoreData对应的数据库文件,一般是ProjectName.sqlite。 AppStore下载SQLPro for SQLite Read_Only,然后用其查看。

CodeReview

代码写的好不好,几个评判标准: 1、稳健性; 2、扩展性; 3、可读性; 总结一起就是,异常分支有处理,同事阅读方便,增改逻辑便捷; ** 一个对象中私有方法和公有方法的泾渭分明,并且按照具体的功能模块进行聚合,用category离散化代码;** 善用继承机制,每个VC都要有通用的VC以方便后期的统一处理; Notification的声明中,要注明发起时机,发送/接受者,参数定义; 一个单例类如果在使用中存在状态,多数情况是多个分支入口调用异步操作,如下

这种情况,最好使用闭包的回调机制,而不是采用状态。(因为单个状态在多次调用过程中会被重置,多个状态逻辑混乱)

总结

在过去的一段时间里,学习新的工作制度,融入新的环境。

一个拥有优秀的学习方法和自我控制能力的人,在每个行业都能焕发出自己的光彩。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Intellij IDEA神器那些让人爱不释手的14种小技巧,统统告诉你!

来源:https://blog.csdn.net/linsongbin1/article/details/80560332

814
来自专栏mySoul

window对象(一) 计时器 定位导航 url解析 浏览历史 对话框 消息推送

一个jQuery作者的写的关于定时器解释,记的顺手订阅一下。John Resig,jQuery之父

1054
来自专栏Micro_awake web

VSCode配置eslint

在Vue.js项目中,使用的是eslint检查。 而在我写完代码后,cnpm run dev运行命令。。。然后悲剧了,一大堆报错!╮(╯▽╰)╭ 安装插件:Ve...

1.8K5
来自专栏屈定‘s Blog

Angular中引入第三方JS库

最近写http://www.itoolshub.com/的时候用到了日期时间选择器,Angular本身material2只有日期选择器,也不知道为什么官方不提供...

8673
来自专栏非著名程序员

倍数提高工作效率的 Android Studio 奇技

这是从Philippe Breault的系列文章《Android Studio Tips Of the Day》中提取出来的自认为精华的部分。这些技巧在实际应用...

2409
来自专栏微信公众号:Java团长

Intellij IDEA神器那些让人爱不释手的小技巧

之前写了一篇介绍IntellIJ IDEA的文章,主要是列出一些平时大家可能没用过或者没怎么用,但是又非常好用的IntellIJ IDEA小技巧。由于篇幅原因,...

852
来自专栏java思维导图

Intellij IDEA神器那些让人爱不释手的14种小技巧,统统告诉你!

来源:https://blog.csdn.net/linsongbin1/article/details/80560332

1025
来自专栏web前端教室

1228-redux学习笔记(摘录) | WEB前端零基础课

今天的WEB零基础课的内容是Redux,它的思路比较“拧”,不怎么好理解,算是react里的一个难点。讲完之后,同学们纷纷表示没听懂, 这个东西只靠听,肯定是搞...

19710
来自专栏Flutter入门

Flutter入门三部曲(1) - 基础认识

image.png 看到整体的架构图,它是由dart完成上层的framework,然后由通过skia来完成图形的绘制。

1.4K6
来自专栏GIS讲堂

lzugis——Arcgis Server for JavaScript API之POI

POI(Point Of Interest),感兴趣点,其实呢,严格意义上说应该不是POI,但是单位就这样叫了,我也就这样叫了,其实现的功能大致是这样的:用过百...

1082

扫码关注云+社区

领取腾讯云代金券