zoukankan      html  css  js  c++  java
  • [BS] 小知识点总结-05

    [BS] 小知识点总结-05

    1. 

    不论UIWindow的rootViewController是navC、tabBarC还是VC,也不管modalVC和rootVC中间隔着多少个VC,但是modal出来的视图,其UI结构一定是这样:

    先是UIWindow,然后是跳转用的完全透明的UITransitionView,然后直接就是modalVC的view。如果将modalVC.view.backgroundColor设置为clearColor,那么将直接看到的是window的颜色。

    综上:通过modal形式弹出控制器,如果不需要动画(animated:NO),完全可以使用一个UIView来替代。

    modal控制器UI层级图:

    2. 关于for循环的 int i = 0;

    for(int i = 0; i<10; i++) { //循环体 }  

    int i = 0;是定义在for代码块里面,但是在循环体外部,不会被循环的局部变量,出了for循环的代码块就不能再使用了。

    i++;代码被定义在循环体内部,每次执行完循环代码,也会执行一次i++;

    类似:

    {//for代码块

       int i = 0;

         while(i<10)

         {//循环体

            printf("C99-for写法 ");

            i++;

          }

    }

    3. 设置访问僵尸对象让Xcode立即报错

     

    4. ARC和MRC混编:  -fno-objc-arc 和 -fobjc-arc

    可以在Build Phases中的Compile Sources中加入编译标记-fno-objc-arc,确实可行,但是文件好多,这种方式适合文件比较少的情况,文件多了难道我们要一个一个加嘛,这 时候我们可以借助一个工具xproj,这是一个脚本,可以很方便的给某个文件夹内的文件添加编译标记,具体使用方法我们看项目主页就行了,既可以给ARC 项目添加MRC标记(-fno-objc-arc),也可以给MRC项目添加ARC标记(-fobjc-arc)。

    5. 用条件编译判断当前是ARC还是MRC

    //通过条件编译判断当前编译环境是ARC还是MRC

    #if __has_feature(objc_arc)

        NSLog(@"当前是arc编译环境");

    #else

        NSLog(@"当前是非arc编译环境");

    #endif

    6. 使用宏Macro的注意点

      (1). 在宏中如果一行代码写不下,可使用来拼接

    #define  Dispatch_once    static dispatch_once_t onceToken;        //加个反斜杠可管到下一行

        dispatch_once(&onceToken, ^{

            _instance = [super allocWithZone:zone];

        });           //最后一行不要反斜杠

      (2)带参数的宏

      A. 带数字参数的宏:在编译预处理时,将宏名替换成右侧字符串,并且将 字符串中的参数 用 宏名后边括号里的参数替换。如果右侧出现左侧参数无法替换的字符,则直接报错。宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串;在定义宏时,一般用一个小括号括住右边字符串的参数。

      #define ADD(a,b)  (a)+(b)   //合法,传入的参数可以替换右侧字符串

      #define ADD(a,b)  Add:(a)+(b)  //不合法。 右侧Add在左侧没有对应的参数替换

      B. 带字符参数的宏: #define  SayHi(arg)  Hi,##arg!     SayHi(world)表示将SayHi替换成Hi,##arg!表达式,并用字符参数world来替换其中的##arg  所以结果是 Hi,world!

      (3) 通过条件编译判断当前编译环境是ARC还是MRC

      #if __has_feature(objc_arc)

          NSLog(@"当前是arc编译环境");

      #else

          NSLog(@"当前是非arc编译环境");

      #endif

        (4)宏中不能随便使用#号,宏里面是不准使用条件编译,因为条件编译是以#if开头,宏里面#后面跟的单词,会自动转译成字符串。就是说#if会被变为字符串“if”,而失去条件编译的职能。故宏中使用条件编译,直接报错。但是,条件编译中可以使用宏,而且经常用。

      (5) 宏定义:http://www.cnblogs.com/mjios/archive/2013/03/20/2969817.html

        条件编译:http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html

        文件包含:http://www.cnblogs.com/mjios/archive/2013/03/20/2971575.html

     7.

    将OC中任何一个对象转成字符串类型,只需要调用它的description方法即可NSString *objStr = [obj description];

    8.

    在TableView和CollectionView的数据源方法cellForRowAtIndexPath或cellForItemAtIndexPath中,如果想让某个UI控件只添加一次,除了使用懒加载,还可以使用如下方法进行:

       NSInteger const tag = 10;  //定义一个不可变的tag

        UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:tag];

        if (lbl == nil) { //确保添加只一次,最好的做法是自定义cell,然后懒加载来确保只添加一次

            lbl = [[UILabel alloc] init];

            [cell.contentView addSubview:lbl];

        }

     

     

    iOS开发者交流群:180080550
  • 相关阅读:
    Android相对布局中控件的常用属性【转】
    Android:仿微信设置菜单
    Android:scrollview与listview共存
    感想12.26
    (C#)GDI+绘制垂直文字
    10.14 近期小结
    学习C++的忠告
    C# TCP学习笔记
    C#读书笔记(4)—重学数组
    近期学习计划 12.23
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5443773.html
Copyright © 2011-2022 走看看