iOS相关内功修炼ios闲来一看

iOS-OC篇 (1~72)

2016-08-06  本文已影响921人  麦穗0615

前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。

obje-c
  • 1. 方法和选择器有何不同?(Difference between method andselector?)
    答:selector 是一个方法的名字,method是一个组合体,包含了名字和实现。



如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的。self.和self->的区别
- self.是调用get或者set方法
- self是当前本身,是一个指向当前对象的指针
- self->直接访问成员变量

   - 因此使用的是copy,所得到的实际是NSArray,它是不可变的,若使用中使用了增、删、改操作,则会crash。 
  可以用字符串来找方法SEL 变量名 = NSSelectorFromString(方法名字的字符串)
  可以运行中用SEL变量反向查出方法名字字符串。NSString *变量名 = NSStringFromSelector(SEL参数);
  取到selector的值以后,执行seletor.SEL变量的执行。用performSelecor方法来执行。
  [对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
  @interface HYBObject: NSObject
  @property (nonatomic,assign) my_struct arg3;
  @property (nonatomic,copy) NSString *arg1;
  @property (nonatomic,copy) NSString *arg2;
  @end
  @implementation HYBObject
   //   在堆上分配的内存,我们要手动释放掉
    - (void)dealloc {
      free(self.arg3);
   }
    @end

测试:
my_struct str = (my_struct)(malloc(sizeof(my_struct)))
str->a = 1;
str->b = 2;
HYBObject *obj = [[HYBObject alloc] init];
obj.arg1 = @"arg1";
obj.arg2 = @"arg2";
obj.arg3 = str;
[self performSelector:@selector(call:) withObject:obj];

  //   在回调时得到正确的数据的
  - (void)call:(HYBObject *)obj {
  NSLog(@"%d %d",obj.arg3->a,obj.arg->b);
  }

52. objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?
实际上,编译器在编译时会转换成objc_msgSend,大概会像这样:
((void (*)(id,SEL)) (void)objc_msgSend) ((id)obj,sel_registerName("foo"));
也就是说,[obj foo];在objc动态编译时,会被转换为:objc_msgSend(obj,@selector(foo));
这样的形式,但是需要根据具体的参数类型及返回值类型进行相应的类型转换。
53. 下面的代码输出什么?
@implementation Son: Father
- (id)init {
self = [super init];
if(self){
NSLog(@"%@",NSStringFromClass([self class]));
NSLog(@"%@",NSStringFromClass([self class]));
}
return self;
}
@end

   //   输出
   NSStringFromClass([self class]) = Son;
   NSStringFromClass([self class]) = Son;

*53. 若一个类有实例变量NSString _foo,调用setValue:forKey时,可以以foo还是_foo作为key?
答:两者都可以

54. 什莫时候使用NSMutableArray,什莫时候使用NSArray?
答:

55. 类NSObject的哪些方法经常被使用?

56.什莫是简便构造方法
答:

57.什莫是构造方法,使用构造方法需要什莫注意点?
- 什莫是构造方法:构造方法是对象初始化并一个实例方法。
- 构造方法有什莫用:一般在构造方法里,对类进行一些初始化操作
注意点:方法开头必须以init开头,接下来名称要大写 例如 initWithName,initLayout
58.创建一个对像需要经过三个步骤?

59.Get方法的作用是什莫?
Get方法的作用:为调用者返回对象内部成员变量

60.Set方法的作用是什莫?Set方法的好处是什莫?

61.结构体中能定义oc对象吗?
不能,因为结构体中只能是类型的声明,不能进行分配空间

62.点语法的本质是什莫?写一个点语法的例子,并写上注释

63.id类型是什莫,instancetype就是什莫,有什莫区别?

64.成员变量的命名以下划线开头的好处?

66.截取字符串『20 | http:ww.baidu.com』中『|』字符串前面和后面的数据,分别输出它们。
- NSString *str = @"20 | http:ww.baidu.com";
NSArray *array = [str componentsSeparatedByString:@" | "];
输出截取后的字符串
for (int i = 0;i<[array count];i++){
NSLog(@"%d = %@",i,[array objectAtIndex:i]);
}

67.写一个完整的代理,包括声明和实现

68. isKindOfClass、isMemberOfClass、selector作用分别是什莫?
① isKindOfClass,作用是,某个对象属于某个类型或者继承自某个类型
② isMemberOfClass某个对象确切属于某个类型
③ selector:通过方法名,获取内存中函数的入口地址

69. 请分别写出SEL、Id、@的意思?
- SEL 是selector的一个 类型,表示一个方法的名字----就是一个方法的入口地址。
- id是一个指向任何一个继承了Object(或者NSObject) 类的对象。需要注意的是id是一个指针,所以在使用id的时候不需要加*
- @: 是OC中的指令符
70. unsigned int 和int有什莫区别。 假设int长度为65535,请写出unsigned int 和int的取值范围

71. Foundation对象,Core Foundation对象有什么区别
- Foundation对象是OC的,Core Foundation对象是C对象
- 数据类型之间的转换
- ARC:bridge_retained(持有对象所有权,F->CF)、bridge_transfer(释放对象所有权CF->F)
- 非ARC:__bridege
72. 编写一个函数,实现递归删除指定路径下的所有文件。
+ (void)deleteFiles:(NSString *)path{
// 1.判断文件还是目录
NSFileManager *fileManger = [NSFileManager defaultManager];
BOOL isDir = NO;
BOOL isExist = [fileManger fileExistsAtPath:path isDirectory:&isDir];
if(isExist){
// 2.判断是不是目录
if(isDir) {
NSArray *dirArray = [fileManger contentOfDirectoryAtPath:path error: nil];
NSString *subPath = nil;
for ( NSString *str in dirArray){
subPath = [path stringByAppendingPathComponent:str];
BOOL issubDir = NO;
[fileManger fileExistsAtExistsAtPath:subPath isDirectory:&issubDir];
[self deleteFiles: subPath];

}else{
   NSLog(@"%@",path)
   [manager removeItenAtPath:filePath error:nil];
  }
}else{
  NSLog(@"你打印的是目录或者不存在"); 
}
 }
   }
上一篇下一篇

猜你喜欢

热点阅读