《iOS知识点梳理-ObjectC语言》

2018-12-15  本文已影响25人  学而不思则罔思而不学则殆

知识点总结中,如有幸被您观看,更有可能看到不足,期待指出交流

前言

这个是高手,这个是高手,这个是高手

方法和选择器的不同
core foundation的内存管理
malloc和new的区别
OC中的反射机制
Class class  NSClassFromString@(@"student");
student *stu = [[class alloc] init];
Class class = [Student class];
NSString *className = NSStringFromClass(class);
SEL 理解和调用

理解:

调用:

协议中<NSObject>是什么意思?子类继承了父业,那么子类会遵守父类中遵守的协议吗?协议中能够定义成员变量?如何约束一个对象类型的变量要存储的地址是一个遵守一个协议对象?
NS/CF/CG/CA/UI 这些前缀的含义
面向对象都有哪些特征以及你对这些特征的理解
Object-C,动态运行时语言
readwrite,readonly,assign,retain,copy,nonatomic属性的作用?
NotificationCenter,kvc,kvo,Delegate,区别
懒加载
OC有多继承吗,没有的话可以用什么方法代替
分别描述类别(categories)和延展(extensions)是什么?以及俩者的区别?继承和类别在实现中有何区别?为什么category只能为对象添加方法,却不能添加成员变量
Object-C有是有方法吗?私有变量呢?如果没有的话,有没有什么代替的方法?
include和#import的区别?#import与@class的区别
浅拷贝和深拷贝
类变量的@protected,@private,@public,@package声明有什么含义?

变量的作用域不同

Objective-C和C,C++之间的联系和区别
目标-动作机制
Objective-C优点和缺点
C语言的函数调用和OC的消息机制有什么区别
什么是谓词

谓词就是通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选

// 定义谓词对象,谓词对象中包含了过滤条件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d", 30];
// 可以使用&&进行多条件过滤
predicate= [NSPredicate preicateWithFormat:@"name='1'&&age > 40"];
array = [persons filteredArrayUsingPredicate:predicate];
// 包含语句的使用
predicate = [NSPredcate predicateWithFormat:@"self.nameIN{'1','2','3'}||sele.age IN{30,40}"]
/** 指定字符开头和指定字符结尾,是否包含指定字符 */ 
// name已a开头的
predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH'a'"];
// name 中包含字符a的
predicate = [NSPredicate redicateWithFormat:@"name Contains'a'"];
// like 进行匹配多个字符
predicate = [NSPredicate predicateWithFormat:@"name like 's'"];
// ?代表一个字符,下面的查询条件是:name中第二个字符是s的
predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];

C与OC混用

atomic和nonatomic的区别
常见的oc数据类型那些,和c的基本类型有啥区别
id 和 nil 代表什么
nil和NULL的区别
像一个nil对象发送消息会发生什么?
类方法和实例方法的本质区别和联系
屏幕快照 2018-12-14 下午5.37.31.png
_block/weak修饰符区别
写一个NSString类的实现
NSString *str = [[NSString alloc]initWithCString:nullTerminatedCString encodeing:encoding];
为什么标准头文件都有类似以下的结构
ifndef __INCvx Worksh
define __INCvx Worksh
ifdef __cplusplus
ectern "C"{
endif
ifdef __cplusplus
}
endif
endif

显然,头文件中的编译宏#ifndef INCvxWorksh,#define INCvxWorksh,#endif 的作用是防止该头文件呗重复引用

init和intwithobject区别(语法)
@property的本质是什么?ibar,getter,setter是如何生成并添加到这个类中的

@property的本质:
@property = ivar(实例变量) + getter (取方法) + setter(存方法)
属性(peoperty)两大概念:
ivar(实例变量),存取方法(access method = getter + setter)
ivar,getter,setter如何生成并添加到类中:
这是编译器自动合成的,通过@synthesize关键字指定,若不指定,默认为这是编译器自动合成的,通过@synthesize关键字指定,若不指定,默认为@shnthesize propertyName = _propertyName;若手动实现了getter/setter方法,则不会自动合成.
现在编译器已经默认为我们添加@synthesize propertyName = propertyName;因此不再需要手动添加,除非你真的要改变成员变量
生成getter方法时,会判断当前属性名是否有
,比如声明属性@property(nonatiomic,copy) NSString *_name; 那么所生成的成员变量就会变成name,如果我们要手动生成getter方法,就要判断是否以开头了.不过,命名都要有规范,是不允许色林属性是使用开头的,不规范的命名,在使用runtime的时候,会带来很多不方便

这个写法会出什么问题:@property(copy)NSMutableArray *array;
@protocol和category中如何使用@property
@property中有哪些属性关键字
isa指针问题
如何访问并修改一个类的私有属性
如何为Class定义一个对外只读对内可读写的属性

在头文件中将属性定义为readonly,在.m文件中将属性新重新定义readwrite

Objective-C中,meta-Class指的什么?

meta-class是Class对象的类,为这个Class类储存类方法,当一个类发送消息时,就会去这个类对应的metaClass中查找那个消息,每个Class都有不同的meta-class,所有的meta-class都使用基类的meta-class(假如类继承NSObject,那么他对应的meta-class也是NSObject)作为他们的类

Objective-C的class是如何实现的,selector是如何转换成C语言的函数调用的
@interface foo
- (int)add:int val;
@end

SEL class_func; //定义一个类方法指针
class_func = @selector(add:int);
对于语言NSString *obj = [[NSData alloc] init]; 编译时和运行时 obj 分别是什么类型
@synthesize和@dynamic分别什么作用
NSString的时候用copy和strong的区别

OC中NSString为不可变字符串的时候,copy和strong都是只分配一次内存,但是如果用copy的时候,需要先判断字符串时候是不可变字符串,如果是不可变字符串,就不再分配控件,如果是可变字符串才分配控件.如果程序中用到NSString的地方特别多,每一次都要先进行判断就会消耗性能,影响用户体验,用strong就不会再进行变短,所以,不可变字符串都可以直接用strong.

NSArray,NSSet,NSDictionary,与NSMutableArray,NSMutableSet, NSMutableDictionary的特性和作用(遇到copy修饰产生变化)

特性:

请把字符串2015-04-10格式化日期转换为NSDate类型
NSString *timeStr = @"2015-04-10";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [formatter fateFromString:timeStr];
// 2015-04-09 16:00:00 + 0000
NSLog(@"%@", date);
在一个对象的方法里面:self.name=@object;和name=@object有什么不同
怎样使用performSelector传入3个以上参数,其中一个为结构体
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

因为系统提供的performSelector的api中,并没有提供三个参数.因此,我们只能传数组或者字典,三十数组或者字典自有存入对象类型,而结构体并不是对象类型,那怎么办呢?没有办法,我们只能通过对象放入结构最为属性传递过去了

typedef struct HYBStruct {
    int a;
    int b;
} *my_struct;

@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.arg3->b);
}
objc中一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系

实际上,编译器在编译的时候会转换成objc_msgSedn,大概会像这样:

(void(*))(id, SEL)
((void) objc_msgSend)
((id)obj, sel_registerName("foo"))

也就是说, [obj foo];在objc动态编译时,会被转换成:objc_msgSend(obj,@selector(foo));这样的形式, 但是需要根据具体的参数类型返回值类型进行相应的类型转换.

下面代码输出是什么
@implementation Son: Father

- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}

@end

结果:

NSStringFromClass([self class]) = Son
NSStringFromClass([super class]) = Son

解析:这个题目主要是考察关于Objective-C中对self和super的理解.我们都知道:self是类的隐藏参数,指向当前调用方法的这个类的实例.那么super呢,很多人会想当然的认为"super"和self类似,应该是指向父类的指针吧!这是很普遍的一个误区.其实super是一个 magic keyword,他的本质是个编译器标识符,和self是指向同一个消息接受者!她们俩个的不同点在于:super告诉编译器,调用class这个方法时,要去父类的方法,而不是本类里面的.上面的例子不管调用[self class]还是[super class],接受消息的对象都是当前 son *xxx 这个对象.当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则会从父类的方法列表中开始找.然后调用父类的这个方法.

若一个类有实例变量NSString *_foo, 调用setValue:forkey:时,可以foo还是_foo作为key
什么时候使用NSMutableArray,什么时候使用NSArray
类NSObject的哪些方法经常被使用
什么是简便构造器
什么是构造器方法,使用构造器的特点
创建一个对象需要经过哪三个步骤
get方法的作用是什么
set方法的作用是什么,set的好处
结构体当中不能定义OC对象吗
点语法本质是什么,写一个点语法的例子,并写上注释
Person *person = [Person new];
person.name = @"itcast";调用了person的setName方法
int age - person.age; // 调用了person的age方法
person.run // 调用了person的run方法
id类型是什么,instancetype是什么,有什么区别
成员变量名的命名以下划线开头的好处
下面这段代码有什么问题
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end

这个会造成死循环,点语法是方法的调用,会一直走这个方法,_age = age;书写也不规范应该是吧newAge改成age

截取字符串"20|http://www.bai.com"中,"I"字符前面和后面的数据,分别输出他们
NSString *str = @"20|http://ww.baidu.com";
NSSArray *array = [str componentsSeparatedByString:@"|"]:
// 打印前后的数据输出
for (int i = 0; i <array.count; i ++) {
    NSLog(@"%d=%@", i,[array objectAtInde:i]);
}
写一个完整的代码,包括声明,实现
// 创建
@protocol MyDelete
@required
- (void)eat:(NSString *)foodName;
@optional
- (void)run;
// 声明
@interface person : NSObject<MyDelagete>
@end
// 实现
@implement person
- (void)eat:(NSString  *)foodName {
    NSLog(@"吃%@",foodName);
}
- (void)run {
    NSLog(@"run!");
}
@end
isKindOfClass,isMemberOfClass,selector作用分别是什么

请分别写出SEL,id,@的意思

unsigned int 和 int 有什么区别.假设int长度为65535,请写出unsigned int 与int 的取值范围

Foundation对象与Core Foundation 对象有什么区别
编写一个函数,实现递归删除地址路径下的所有文件
+ (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 contentsOfDirectoryAtPath:path error:nil];
            NSString * subPath = nil;
            for (NSString * str in dirArray) {
                subPath  = [path stringByAppendingPathComponent:str];
                BOOL issubDir = NO;
                [fileManger fileExistsAtPath:subPath isDirectory:&issubDir];
                [self deleteFiles:subPath];
            }
        }else{
            NSLog(@"%@",path);
            [manager removeItemAtPath:filePath error:nil];
        }
    }else{
        NSLog(@"你打印的是目录或者不存在");
    }
}
上一篇 下一篇

猜你喜欢

热点阅读