iOS 每天一道面试题

同为菜逼,共同努力。

1.nil Nil NULL NSNull 区别。

nil:指向oc中对象的空指针,针对对象。

Nil:指向oc中类的空指针,针对类。

NULL:指向其他类型的空指针,如一个c类型的内存指针,基本数据类型为空,基本类型。

NSNull:在集合对象中,表示空值的对象。

参考博客这是我发现写的比较详细的博客.

2.你是否接触过oc中的反射机制?简单聊一下概念和使用.

    //    • class反射
    //    • 通过类名的字符串形式实例化对象
    Class class1 = NSClassFromString(@"UILabel");
    id label = [[class1 alloc ]init];
    NSLog(@"label = %@",label);
    //    • 将类名变为字符串
    Class class2 =[UILabel class];
    NSString *className = NSStringFromClass(class2);
    NSLog(@"className = %@",className);

    Student *stu = [[Student alloc] init];
    //    • SEL的反射
    //    • 通过方法的字符串形式实例化方法
    SEL selector = NSSelectorFromString(@"setName:");
    [stu performSelector:selector withObject:@"GanMaoShen"]; //注意如果有两个参数,使用两个withObject:参数;
    NSLog(@"stu.name =%@",stu.name);
    //    • 将方法变成字符串
    NSString *select =  NSStringFromSelector(@selector(testVoidFuncWithTestParam:));
    NSString *select2 =  NSStringFromSelector(_cmd);
    NSLog(@"select =%@ select2 = %@",select,select2);
2017-03-27 20:19:07.658 test[10559:3059755] label = <UILabel: 0x7fdcae00fed0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x6000002834d0>>
2017-03-27 20:19:07.659 test[10559:3059755] className = UILabel
2017-03-27 20:19:07.659 test[10559:3059755] stu.name =GanMaoShen
2017-03-27 20:19:07.659 test[10559:3059755] select =testVoidFuncWithTestParam: select2 = viewDidLoad

3.Block的传值,传址,内存管理,循环引用(retain cycle)。(狠补了一下block的知识,发现block中很多知识点,所以还是要弄透)

两篇很好的block基础博客
block的用法,定义.
block两个界面的传值.

void test1()
{
  int a = 10;
}
void test2()
{
    __block int a = 10;
}
void test3()
{
    static int a = 10;
}
int a = 10;
void test4()
{
}
总结:block中只有普通局部变量(test1)是传值,其他情况(test2,test3,test4)都是传址。
#block的内存管理
ARC下:
- block可以使用copy和strong,并且是一个对象。

#Block如果没有引用外部变量
保存在全局区(MRC/ARC一样)
#Block如果引用外部变量
ARC保存在 堆区; MRC保存在 栈区必须用copy修饰block;

推荐博客深入浅出-iOS Block原理和内存中位置

block循环引用
1.如果block代码块的内部,使用了外面的强引用对象,block代码块的内部会自动产生一个强引用,引用着该对象,不会销毁,造成循环引用.
解决:下面代码在block外部实现.
__weak typeof(self) weakSelf = self; 
#define WeakSelf(type)  __weak typeof(type) weak##type = type;
2.但是如果在block内部使用延时操作的还使用弱指针的话会取不到该弱指针,需要在block内部再将弱指针强引用一下.
__strong typeof(self) strongSelf = weakSelf;
#define StrongSelf(type)  __strong typeof(type) strong##type = weak##type;

关于循环引用很好的博客Swift与OC真正去理解Block解决循环引用的技巧

4.如何在@category和@protocol中添加@property

首先你要知道category和protocol和作用和区别,同时回顾这道题的同时,同时回顾extension 和category。
extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西。 extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。
更深入一点的话我推荐这个帖子。iOS 类别不能添加属性原理?

@dynamic 和 @synthesize的区别:
在@implementation 中通过@dynamic xxx 告诉编译器、xxx属性的setter、getter方法由开发者自己来生成
@ synthesize xxx = _xxx; 告诉编译器、xxx属性的setter、getter方法由编译器来生成、同时用_xxx 来合成 成员变量

好,步入正题。

4.1@protocol中添加property

在protocol中添加property时,其实就是声明了 getter 和 setter 方法,在实现这个protocol协议的类中,我们要自己手动添加实例变量,并且需要实现setter/getter方法,实现setter/getter方法有两种方式,一种是自动生成(@synthesize) ,另一种是手动生成(@dynamic)此时又有了拓展问题(@synthesize和@dynamic的作用 见 题5)

@protocol PersonDelegate <NSObject>
@property (nonatomic, copy) NSString *name;
@end
//personn类
@interface Person : NSObject
@end
#import "Person.h"
@interface Student : NSObject <PersonDelegate>
- (void)testLog;
@end
#import "Student.h"

@implementation Student
//自动实现setter和getter方法
@synthesize name;

- (void)testLog {
    NSLog(@"self.name=%@",self.name);
}

@end

手动实现setter和getter

#import "Person.h"
@interface Student2 : NSObject <PersonDelegate>
{
    //声明一个实例变量
    NSString *_name;
}
- (void)testLog;
@end

#import "Student2.h"

@implementation Student2
@dynamic name;
- (void)testLog {
    NSLog(@"self.name=%@",self.name);
}
- (void)setName:(NSString *)name
{
    _name = name;
}
- (NSString *)name
{
    return _name;
}
@end
    Student *stu1 = [Student new];
    stu1.name = @"testName";
    [stu1 testLog];
    Student2 *stu2 = [Student2 new];
    stu2.name = @"testName";
    [stu2 testLog];

关于category实现property主要是利用runtime的关联方法(mjrefresh中也有用到)。

objc_setAssociatedObject   objc_getAssociatedObject
@interface Person (Test)
@property (nonatomic, copy) NSString *tmpName;
- (void)testLog;
@end
#import "Person+Test.h"
#import <objc/runtime.h>

@implementation Person (Test)
- (void)setTmpName:(NSString *)tmpName
{
    objc_setAssociatedObject(self, @selector(tmpName), tmpName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)tmpName
{
    return objc_getAssociatedObject(self, @selector(tmpName));
}
- (void)testLog {
    NSLog(@"self.name=%@",self.tmpName);
}
@end
    Person *p1 = [Person new];
    p1.tmpName = @"tmpName";
    [p1 testLog];

当然还有一种利用临时变量的方法完成添加属性的方法。参考博客
iOS Category 和 Protocol 中的 Property 你们真的会了么?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,960评论 0 7
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,003评论 0 12
  • 面试笔试都是必考语法知识的。请认真复习和深入研究OC。 Objective-C 方法和选择器有何不同?(Diffe...
    b485c88ab697阅读 5,674评论 0 35
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,345评论 0 35
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 4,131评论 2 19