iOS开发笔记(六)

前言

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

正文

1、cell和cell.contentView 的区别

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

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

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


正常模式

iOS开发笔记(六)_第1张图片
编辑模式

[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多线程和内存管理》

iOS开发笔记(六)_第2张图片

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的声明中,要注明发起时机,发送/接受者,参数定义;
一个单例类如果在使用中存在状态,多数情况是多个分支入口调用异步操作,如下

iOS开发笔记(六)_第3张图片

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

总结

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

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

你可能感兴趣的:(iOS开发笔记(六))