IOS学习总结分析之二:10.13-10.31第一部分

1.view的生命周期的各个函数的含义,以及各个函数最好应该做什么样的工作(viewDidLoad,viewWillAppear,viewDidAppear,viewWill/DidDisappear,viewDidUnload/viewDidDispose)


以上所有的方法都会在适当地时候被自动调用当你加载,呈现,隐藏viewController。非常重要的一点就是这些方法是被附加在UIViewController这个类中,而并非UIView本身。如果只使用UIView的话,无法利用任何特点。


·viewDidLoad - 当你创建类(viewController)并且把它从xib文件中加载的时候会调用这个方法。非常适合进行初始化和一次性的设置。

·vieWillAppear - 就在你的view刚要出现的时候调用这个方法,非常适合隐藏或者展示任何的区域或者你想要每次在view出现之前要执行的运算。

·viewDidAppear - view出现之后会被调用,适合调用动画或者外部数据的加载。(也就是比较耗时的工作)

·viewWill/DidDisappear - 和viewWill/DidAppear是一样的思路

·viewDidUnload/viewDidDispose - 在OC语言中,这个方法是用来清理和释放东西的,但是会被自动调用,所以一般情况下不会真的调用到这里。


举一反三:(1)比如现在要做一个显示天气的view,

·viewDidLoad - 主题的设置,颜色和图片的加载都适合放在这里,还有其他一次性的工作也可以放在这里。

·viewWillAppear - 将网络连接是否正常的判断放在这里,然后显示或者隐藏天气获取失败的提示,可以选择用多线程在这里获取外部数据

·viewDidAppear - 这里开始播放天气标志的动画,并且网络正常的话要获取天气的数据放置在这里,因为是外部数据,而且需要等待网络返回结果


(2)比如现在又要做一个显示计步器数字的视图

·viewDidLoad - 这里要放置UI和Theme的初始化,然后进行一些一次性的判断,比如手机的版本型号等等

·viewWillAppear - 根据手机的型号来决定是否显示或者隐藏手机有没有自带计步器的提示,然后获取数据,如果比较消耗时间,也可以放到didappear中进行

·viewDidAppear - 如果数据的获取消耗时间,则放在这里,然后显示动画什么的


(3)比如现在要做一个显示股票信息的视图

·viewDidLoad - 这里来设置UI,theme以及要显示的股票的数量,还有视图的类型,是数字,曲线还是饼图

·viewWillAppear - 这里来设置是否显示或者隐藏一些东西,从shareDefault中获取数据,并更新UI,让它显示出来。

·viewDidAppear - 这里要从网络获取最新数据,并现实一些必要的动画什么的


2.didReceiveMemoryWarning这个方法的妙用:

在这个方法中设置断点的话可以观察app什么时候会调用到这个方法,然后更好的了解软件的内存问题


3.Block中变量的作用域以及函数的参数的问题


根据官方文档,A block is a stack-based data structure that captures references to existing variables and—like a normal compound statement—new temporary ones. It can compute and return a value and it can further take parameters to vary its computation. A block may refer to variables available within the scope of its declarations. By default, the value of such variables are copied into the block as execution passes over the block’s declaration. The value of a copied variable will remain constant across all invocations of the block.

Optionally, you can declare a variable the storage type __block. A __block variable allows a block to modify the variable’s value. The modified value will be visible in both the scope of declaration and within any other blocks that refer to the variable.

block是基于栈的数据结构,它获取变量的指针,就像一个正常的复合语句,新的临时变量。它可以计算并返回一个值,甚至可以用参数来使它的计算发生变化。一个block可以指向声明范围内的变量。默认情况下,当执行的动作被传到block的声明中,这些变量的值会被复制到block中。被复制的变量的值会在所有block的调用中保持恒定不变也就是即使在block中被修改了,但是在block之外是没有变化的。或者,用__block来定义一个存储类型的话,这个变量会允许一个block来看到这个值,而且这个值将会在声明范围内以及其他任何的block中可见。


举一反三:(1)新建立一个工程,然后进行测试,代码如下:

#import <Foundation/Foundation.h>

typedef void (^ChangeValue)(void);

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        int age = 24;

        __block int height = 180;

        ChangeValue changeValue = ^{

            age++;

            height++;

            NSLog(@"the age in block is %d",age);

            NSLog(@"the height in block is %d",height);

        };

        changeValue;

        NSLog(@"the age is %d",age);

        NSLog(@"the height is %d",height);

        }

    return 0;

}

在这里age++;那一行会报错,因为age对于block来说是不可见的。

block对于数据的修改:

#import <Foundation/Foundation.h>

#import "VariableChanger.h"

typedef void (^ChangeValue)(void);

int main(int argc,const char * argv[]) {

    @autoreleasepool {

        int age = 24;//not NSObject

        NSString *string = @"not changed value”;// is NSObject

        [VariableChangerchangeValue:age];

        [VariableChangerchangeValueForString:string];

        

        NSLog(@"the age is %d",age);

        NSLog(@"the string is %@",string);

        }

    return 0;

}


在这里,age和string的值并没有被改变;所以可以知道,在函数中修改和在block中修改一个变量之后,变量本身并没有被改变。原因是函数的参数只是把数值给传了进去,运算之后那个数值变化了,但是并没有传出来到main中的这个指针中,所以指针所指向的内容仍然是原来的值,没有发生改变。


4.dispatch_async 和dispatch_sync的区别

The async part of dispatch async vs sync is different than concurrent vs serial. Async means that the function returns immediately, sync means that it'll wait until the block is executed.

首先解释一下dispatch_async和dispatch_sync的区别,async是异步的意思,是说这个方程不会等block中的代码执行完毕,而是直接跳到下一句,而sync的意思是会等到block中的代码执行完毕才会跳到下一步。

下面贴上两段代码和打印结果:

#import <Foundation/Foundation.h>


int main(int argc,const char * argv[]) {

    @autoreleasepool {

        

        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

            for (int i =0; i<100000000; i++) {

                i = i;

            }

            NSLog(@"calculating...");

        });

        NSLog(@"calculation finished!");

    }

    return 0;

}

打印结果:

2014-11-01 19:31:39.424 AsyncAndSync[1633:303] calculating...

2014-11-01 19:31:39.426 AsyncAndSync[1633:303] calculation finished!

Program ended with exit code: 0

用async得代码:

#import <Foundation/Foundation.h>


int main(int argc,const char * argv[]) {

    @autoreleasepool {

        

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

            for (int i =0; i<100000000; i++) {

                i = i;

            }

            NSLog(@"calculating...");

        });

        NSLog(@"calculation finished!");

    }

    return 0;

}

打印结果:

2014-11-01 19:35:53.446 AsyncAndSync[1658:303] calculation finished!

Program ended with exit code: 0

根据上边的结果可以看出,async是直接跳到了calculation finished,而sync会等到计算完成后再执行calculation finished。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值