面试题

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关键字。

面试题_第1张图片
屏幕快照 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

#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

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

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" "表示引入自定义头文件

你可能感兴趣的:(面试题)