面试相关

1.	怎么保证多人开发进行内存泄露的检查.
1>	非ARC可以使用使用Analyze进行代码的静态分析(xcode-->product-->analyze:蓝色表示建议)
2>	为避免不必要的麻烦, 多人开发时尽量使用ARC

单例设计相关:
1.单例设计模式(Singleton)
 什么: 它可以保证某个类创建出来的对象永远只有1个
 作用(为什么要用):
  节省内存开销; 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的);一般来说, 工具类设计为单例模式比较合适

 怎么实现单例模式? MRC(非ARC), ARC
非ARC实现单例:
@implementation MJSoundTool
SingletonM(SoundTool)
//1,复写allocWithZone方法;2,复写release(防止被销毁),retain方法防止增加计算器,retainCount保证计数器永远为1 ;3,对外提供一个sharedxx方法
//static MJSoundTool *_soundTool = nil;
//
///**复写allocWithZone,一旦复写后,所有分配内存空间的操作都会在这个方法被调用
// *  alloc方法内部会调用allocWithZone:
// *  zone : 系统分配给app的内存
// */
//+ (id)allocWithZone:(struct _NSZone *)zone
//{
//    if (_soundTool == nil) {//创建
//        static dispatch_once_t onceToken;
//        dispatch_once(&onceToken, ^{ // 安全(这个代码只会被调用一次)
//            _soundTool = [super allocWithZone:zone];
//        });
//    }
//    return _soundTool;
//}
//
//- (id)init
//{
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        _soundTool = [super init];
//    });
//    return _soundTool;
//}
//
//+ (instancetype)sharedSoundTool
//{
//    return [[self alloc] init];
//}
//
//- (oneway void)release
//{
//
//}
//
//- (id)retain
//{
//    return self;
//}
//
//- (NSUInteger)retainCount
//{
//    return 1;
//}


//- (void)dealloc
//{
//
//}

ARC下面的单例实现:在非ARC下少了realse,retain,retaincout方法

2.非自动内存管理情况下怎么做单例模式.
创建单例设计模式的基本步骤 •
>声明一个单件对象的静态实例,并初始化为nil。 
>创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例
>实现NScopying协议, 覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产 生另一个对象。 
>覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态。 
>在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实例被正确的创建和初始化。 

3.对于类方法(静态方法)默认是autorelease的。所有类方法都会这样吗?
1> 系统自带的绝大数类方法返回的对象,都是经过autorelease的 ;像alloc方法就不是autorelease

4.block在ARC中和MRC中的用法有什么区别,需要注意什么
1.对于没有引用外部变量的Block,无论在ARC还是非ARC下,类型都是__NSGlobalBlock__,这种类型的block可以理解成一种全局的block,不需要考虑作用域问题。同时,对他进行Copy或者Retain操作也是无效的

2.应注意避免循环引用

5.什么情况下会发生内存泄漏和内存溢出?
当程序在申请内存后,无法释放已申请的内存空间(例如一个对象或者变量使用完成后没有释放,这个对象一直占用着内存),一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。内存泄露会最终会导致内存溢出!
当程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。

6.[NSArray arrayWithobject:<id>] 这个方法添加对象后,需要对这个数组做释放操作吗?
	不需要 这个对象被放到自动释放池中 

7.Json数据的解析,和解析数据的时候有内存泄露吗?有的话 如何解决		
1>	JSON解析的方案:
	SBJson
	JSONkit
	NSJSONSerialization (官方自带)

2>	内存泄漏么?

8. 自动释放池底层怎么实现
自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除, 并且会给池子里面所有的对象都会做一次release操作.

自动释放池放在栈里面,

KVO:一个对象去监听另一个对象的属性是否改变
示例:
控制器:


@interface MJViewController ()
@property (nonatomic, strong) MJPerson *person;
@property (nonatomic, strong) MJDog *dog;
@end


@implementation MJViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([MJPerson class], &count);
    
    for (int i = 0; i<count; i++) {
        // 取出i位置对应的成员变量
        Ivar ivar = ivars[i];
        
        // 查看成员变量
        const char *name = ivar_getName(ivar);
        NSLog(@"%s", name);
    }
    
    
    self.person = [[MJPerson alloc] init];
    self.dog = [[MJDog alloc] init];//dog监听Person的age属性
    
//    NSLog(@"%@ %@", self.person.class, self.person)
    
    // 让self.dog监听self.person的age属性的改变
    [self.person addObserver:self.dog forKeyPath:@"age" options:0 context:nil];
    
    
    // Foundation
//    NSDictionary
//    NSArray
//    NSString
//    NSArray *array = [NSArray array];
//    array.count;
    
    // Core Foundation
//    CFDictionaryRef
//    CFArrayRef
//    CFStringRef
//    CFArrayRef array2 = CFArrayCreate(NULL, NULL, 10, NULL);
//    CFArrayGetCount(array2);
    
    NSString *str = @"dfshgfkhgsdkhgf";
    
//    (__bridge <#type#>)<#expression#>
    // 在Foundation和Core Foundation数据之间进行转换(没有做任何的内存管理, 只是简单的转换)
    
    
//    NSArray *array1 = [[NSArray alloc] init];
//    
//    CFArrayRef array2 = (__bridge_retained CFArrayRef)array1;
//    
//    [array1 release];
    
    
    
    
//    (__bridge_retained <#CF type#>)<#expression#>
    // Foundation --> Core Foundation
    
//    (__bridge_transfer <#Objective-C type#>)<#expression#>
    // Core Foundation --> Foundation
    
    
//    CFArrayRef array3 = CFArrayCreate(NULL, NULL, 10, NULL);
//    
//    NSArray *array4 = (__bridge_transfer NSArray *)array3;
//    
//    CFRelease(array3);
}





- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.person.age = 30;
}


@end

Dog:
#import "MJDog.h"


@implementation MJDog


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"狗监听到%@对象的%@属性改变了", object, keyPath);
}


@end

KVO内部实现原理:
1,系统会自动生成一个personXX类(派生类:在运行时产生),并且实现person中的setAge方法(复写) 
2,在setAge方法中调用willChageValueForKey ,<span style="font-family: Arial, Helvetica, sans-serif;">didChageValueForKey,这两个方法又会调用:</span><span style="font-family: Arial, Helvetica, sans-serif;">- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context</span>
<span style="font-family:Arial, Helvetica, sans-serif;">
</span>
<span style="font-family:Arial, Helvetica, sans-serif;"></span><pre name="code" class="objc"><span style="font-family:Arial, Helvetica, sans-serif;">Foundation,Core Foundation区别?</span>
 
<span style="font-family:Arial, Helvetica, sans-serif;">Foundation :NSDictionary,NSArray ..... -->采用oc实现,面向对象,开发中用</span>
<span style="font-family:Arial, Helvetica, sans-serif;">Core Foundation:CFArrayRef,....-->采用C实现,用函数操作,一般用于系统自带</span>
<span style="font-family:Arial, Helvetica, sans-serif;">两者可以通过桥接进行转换,有三种桥接方法:</span>
<span style="font-family:Arial, Helvetica, sans-serif;">    (__bridge <#type#>)<#expression#>: 在Foundation和Core Foundation数据之间进行转换(没有做任何的内存管理, 只是简单的转换)
    (__bridge_transfer <#Objective-C type#>)<#expression#>: Core Foundation --> Foundation  ,会自动管理内存 
    (__bridge_retained <#CF type#>)<#expression#>: Foundation --> Core Foundation,会自动管理内存
</span><pre name="code" class="objc">
 
<p><span style="color:#3366FF;">1.     </span><span style="color:#3366FF;">KVO</span><span style="color:#3366FF;">内部实现原理</span></p><p>1>  KVO是基于runtime机制实现的</p><p>2>  当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。</p><p>派生类在被重写的 setter 方法实现真正的通知机制(Personà NSKVONotifying_Person)</p><p> </p><p><span style="color:#3366FF;">2.     </span><span style="color:#3366FF;">是否可以把比较耗时的操作放在</span><span style="color:#3366FF;">NSNotificationCenter</span><span style="color:#3366FF;">中</span></p><p><span style="color:red;">通知中心所做的操作在主线程,比较耗时的一般开启一个线程单独去跑。</span></p><p> </p><p><span style="color:#3366FF;">3</span><span style="color:#3366FF;">.</span><span style="color:#3366FF;">Foundation</span><span style="color:#3366FF;">对象与</span><span style="color:#3366FF;">Core Foundation</span><span style="color:#3366FF;">对象有什么区别</span></p><p><span style="color:red;">1> Foundation</span><span style="color:red;">对象是</span><span style="color:red;">OC</span><span style="color:red;">的,</span><span style="color:red;">Core Foundation</span><span style="color:red;">对象是</span><span style="color:red;">C</span><span style="color:red;">对象</span></p><p><span style="color:red;">2> </span><span style="color:red;">数据类型之间的转换</span></p><p><span style="color:#3366FF;">l  </span><span style="color:red;">ARC</span><span style="color:#3366FF;">:__bridge_retained</span><span style="color:#3366FF;">、</span><span style="color:#3366FF;">__bridge_transfer</span></p><p><span style="color:red;">l  </span><span style="color:red;">非</span><span style="color:red;">ARC:</span><span style="color:#3366FF;"> __bridge</span></p><p> </p><p><span style="color:#3366FF;">4</span><span style="color:#3366FF;">.不用中间变量</span><span style="color:#3366FF;">,</span><span style="color:#3366FF;">用两种方法交换</span><span style="color:#3366FF;">A</span><span style="color:#3366FF;">和</span><span style="color:#3366FF;">B</span><span style="color:#3366FF;">的值</span></p><p>A = A + B</p><p>B = A - B</p><p>A = A - B</p><p> </p><p><span style="color:#3366FF;">5</span><span style="color:#3366FF;">.简单描述下对单利模式设计的理解?</span></p><p><span style="color:red;">节省内存资源,一个应用就一个对象。</span></p><p> </p><p><span style="color:#3366FF;">6</span><span style="color:#3366FF;">.什么是动态,举例说明</span></p><p>1> 在程序运行过程才执行的操作</p><p> </p><p><span style="color:#3366FF;">7</span><span style="color:#3366FF;">.</span><span style="color:#3366FF;">runtime</span><span style="color:#3366FF;">实现的机制是什么</span><span style="color:#3366FF;">,</span><span style="color:#3366FF;">怎么用,一般用于干嘛</span><span style="color:#3366FF;">. </span><span style="color:#3366FF;">你还能记得你所使用的相关的头文件或者某些方法的名称吗?</span></p><p><span style="color:red;">运行时机制,</span><span style="color:red;">runtime</span><span style="color:red;">库里面包含了跟类、成员变量、方法相关的</span><span style="color:red;">API</span><span style="color:red;">,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等</span><span style="color:red;">需要导入</span><span style="color:red;"><objc/message.h><objc/runtime.h></span></p><p>1>  runtime,运行时机制,它是一套C语言库</p><p>2>  实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)</p><p>3>  因此,可以说runtime是OC的底层实现,是OC的幕后执行者</p><p>4>  有了runtime库,能做什么事情呢?runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等</p><p>5>  因此,有了runtime,想怎么改就怎么改</p><p> </p><p><span style="color:#3366FF;">8</span><span style="color:#3366FF;">.是否使用</span><span style="color:#3366FF;">Core Text</span><span style="color:#3366FF;">或者</span><span style="color:#3366FF;">Core Image</span><span style="color:#3366FF;">等?如果使用过,请谈谈你使用</span><span style="color:#3366FF;">CoreText</span><span style="color:#3366FF;">或者</span><span style="color:#3366FF;">Core Image</span><span style="color:#3366FF;">的体验。</span></p><p>CoreText</p><p align="left">•   随意修改文本的样式</p><p align="left">•   图文混排(纯C语言)</p><p align="left">•   国外:Niumb-->coreText框架</p><p align="left">Core Image(滤镜处理框架)</p><p align="left">* 能调节图片的各种属性(对比度, 色温, 色差等)</p><p><span style="color:#3366FF;"> </span></p><p><span style="color:#3366FF;">9</span><span style="color:#3366FF;">.</span><span style="color:#3366FF;">NSNotification</span><span style="color:#3366FF;">和</span><span style="color:#3366FF;">KVO</span><span style="color:#3366FF;">的区别和用法是什么?什么时候应该使用通知,什么时候应该使用</span><span style="color:#3366FF;">KVO</span><span style="color:#3366FF;">,它们的实现上有什么区别吗?如果用</span><span style="color:#3366FF;">protocol</span><span style="color:#3366FF;">和</span><span style="color:#3366FF;">delegate</span><span style="color:#3366FF;">(或者</span><span style="color:#3366FF;">delegate</span><span style="color:#3366FF;">的</span><span style="color:#3366FF;">Array</span><span style="color:#3366FF;">)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然</span><span style="color:#3366FF;">protocol</span><span style="color:#3366FF;">和</span><span style="color:#3366FF;">delegate</span><span style="color:#3366FF;">这种东西面试已经面烂了…)</span></p><p>通知比较灵活(1个通知能被多个对象接收, 1个对象能接收多个通知), </p><p> </p><p>代理比较规范,但是代码多(默认是1对1)</p><p>KVO性能不好(底层会动态产生新的类),只能监听某个对象属性的改变, 不推荐使用(1个对象的属性能被多个对象监听,  1个对象能监听多个对象的其他属性)</p><p> </p><p>更详细参考:</p><p>http://blog.csdn.net/dqjyong/article/details/7685933</p><p>
</p><p><span style="color:#4BACC6;">10</span><span style="color:#4BACC6;">.</span><span style="color:#4BACC6;">Block</span><span style="color:#4BACC6;">内部的实现原理</span></p><p>Objective-C是对C语言的扩展,block的实现是基于指针和函数指针</p><p> </p><p><span style="color:#3366FF;">11. </span><span style="color:#3366FF;">有两个数组</span><span style="color:#3366FF;">a,b</span><span style="color:#3366FF;">,大小都为</span><span style="color:#3366FF;">n,</span><span style="color:#3366FF;">数组元素的值任意,无序;</span></p><p><span style="color:#3366FF;">要求:通过交换</span><span style="color:#3366FF;">a,b</span><span style="color:#3366FF;">中的元素,使数组</span><span style="color:#3366FF;">a</span><span style="color:#3366FF;">元素的和与数组</span><span style="color:#3366FF;">b</span><span style="color:#3366FF;">元素的和之间的差最小</span></p><p><span style="color:red;">算法题,要么靠功底,要么百度</span></p>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值