面试题

作者: 女王大人heheh | 来源:发表于2015-11-11 12:02 被阅读56次

    sizeof 和strlen的区别


    举例2015-11-11 上午11.05.13.png

    1.首先,sizeof()是用来计算字符串或其他对象所占内存的字节数;char a[40];在创建字符数组a的时候就给a分配了40*sizeof(char)的字节内存;
    2.strlen(),就是计算当前字符串的长度并返回包括\0;


    do while 和while do 的区别

    while语句是先测试条件再执行语句,条件不符后终止
    do while语句是先执行语句再测试条件,条件不符后终止,所以do while循环至少执行一次


    property中属性retain,copy,assign的含义分别是什么?有什么区别?有什么主意事项?

    @property是属性的属性设置分三类

    retain,copy,assign属于其中语义设置类

    1.assign:使用 assign声明属性对应的实例变量存取器方法的实现,是在方法里直接赋值、取值‘并没有操作内存里的引用计数。一般用来将基本数据的属性特征声明为assign

    1. reatain:使用 reatain声明的属性对应的实例变量存取器方法的实现,内部会坐内存优化处理:修改对象的引用计数
    2. copy:使用copy 实名的属性对应的实例变量存取器方法的实现,内部会坐内存优化处理:将对象拷贝一份,然后修改新对象的引用计数(区分深拷贝和浅拷贝)

    一般情况下,将OC中的对象声明为retain或者copy特性

    如果属性是 对象类型( 如int,float等)属性的语义设置使用assign。
    如果属性是对象类型( 如NSStrng、NSArray等)属性的语义设
    置使用 retain。
    如果属性是对象类型并且想得到参数的copy,使用 copy关键字。

    屏幕快照 2015-11-11 上午11.31.02.png

    # import和# include有什么区别,@class呢?#improt<>和#improt" "呢?

    http://blog.csdn.net/jiangwei0910410003/article/details/41774747


    一.import和# include的区别

    当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误。
    但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了。

    二、关键字@class的作用

    在来看一下OC中的关键字@class的作用,在看他的作用之前,先来看一个问题:
    现在有一个课程类Classes和学生类Student,他们两之间需要相互引用(导入)。直接看代码比较直接:
    Classes.h
    [objc] view plaincopy
    //
    // Classes.h
    // 08_@class
    //
    // Created by jiangwei on 14-10-11.
    // Copyright (c) 2014年 jiangwei. All rights reserved.
    //

    #import <Foundation/Foundation.h>

    #import "Student.h"

    //不会将Student.h拷贝过来,只是告诉编译器Student这个类在别的地方中有定义,这样就不知道这个类中任何信息(哪些属性和方法)
    //@class Student;

    @interface Classes : NSObject{

    @public
    Student *_student;
    }

    • (void)t1;

    @end
    导入Student.h头文件

    Classes.m
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
    //
    // Classes.m
    // 08_@class
    //
    // Created by jiangwei on 14-10-11.
    // Copyright (c) 2014年 jiangwei. All rights reserved.
    //

    #import "Classes.h"

    //#import "Student.h"

    @implementation Classes

    • (void)t1{
      [_student work];
      }

    @end

    在来看一下Student类
    Student.h
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
    // Student.h
    // 08_@class
    //
    // Created by jiangwei on 14-10-11.
    // Copyright (c) 2014年 jiangwei. All rights reserved.
    //

    #import <Foundation/Foundation.h>

    import "Classes.h"

    @interface Student : NSObject{
    Classes *_classes;
    }

    • (void)work;

    @end
    同样的也导入Classes.h头文件

    Student.m
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
    //
    // Student.m
    // 08_@class
    //
    // Created by jiangwei on 14-10-11.
    // Copyright (c) 2014年 jiangwei. All rights reserved.
    //

    #import "Student.h"

    @implementation Student

    • (void)work{
      NSLog(@"work");
      }

    @end

    在来看一下测试代码:
    main.m
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
    //
    // main.m
    // 08_@class
    //
    // Created by jiangwei on 14-10-11.
    // Copyright (c) 2014年 jiangwei. All rights reserved.
    //

    import <Foundation/Foundation.h>

    import "Classes.h"

    import "Student.h"

    //Classes和Student相互导入会出现问题
    //这时候我们就可以使用@class解决这样的问题
    //我们一般在.h文件中使用@class,因为在.h文件中一般是不会使用类的属性和方法的
    //在.m文件中可以导入.h文件
    int main(int argc, const charchar * argv[]) {
    @autoreleasepool {
    Classes *cls =[[Classes alloc] init];
    Student *stu = [[Student alloc] init];
    cls->_student = stu;
    [cls t1];

    }  
    return 0;  
    

    }
    这里有一个问题注意一下:我们看到了这里是如何使用Classes中的属性_student的,因为在Classes类中属性_student是@public的,所以可以直接使用,用的是箭头符号,和C/C++中的指针变量调用差不多。记住了,这里就说到了如何直接访问一个类中的@public修饰符的属性变量


    #improt<>和#improt" "

    #improt<>表示引入的系统头文件

    #improt" "表示引入自定义头文件

    相关文章

      网友评论

          本文标题:面试题

          本文链接:https://www.haomeiwen.com/subject/hflchttx.html