基礎(chǔ)知識(shí)
內(nèi)存中的棧和堆的區(qū)別是什么?那些數(shù)據(jù)在棧上,哪些在堆上?
- 按管理方式分
- 對(duì)于棧來講,是由系統(tǒng)編譯器自動(dòng)管理,不需要程序員手動(dòng)管理
- 對(duì)于堆來講,釋放工作由程序員手動(dòng)管理,不及時(shí)回收容易產(chǎn)生內(nèi)存泄露
- 按分配方式分
- 堆是動(dòng)態(tài)分配和回收內(nèi)存的,沒有靜態(tài)分配的堆
- 棧有兩種分配方式:靜態(tài)分配和動(dòng)態(tài)分配
- 靜態(tài)分配是系統(tǒng)編譯器完成的,比如局部變量的分配
- 動(dòng)態(tài)分配是有alloc函數(shù)進(jìn)行分配的,但是棧的動(dòng)態(tài)分配和堆是不同的,它的動(dòng)態(tài)分配也由系統(tǒng)編譯器進(jìn)行釋放,不需要程序員手動(dòng)管理
非OC對(duì)象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收)
OC對(duì)象存放于堆里面(堆內(nèi)存要程序員手動(dòng)回收)[1]
#define和const定義的變量,有什么區(qū)別?
const定義的不可修改,為常量;
#define是宏定義,是預(yù)編譯指令,在編譯階段替換用到宏的地方。
- 相同點(diǎn)
都可定義常量 - 不同點(diǎn)
const定義的只分配一次內(nèi)存,#define是替換,替換之后,該怎么分配內(nèi)存還怎么分配;
#define可以定義函數(shù);[2]
#define用于單例:[3]
創(chuàng)建一個(gè)HCSingleton.h文件
// .h文件
#define HCSingletonH(name) + (instancetype)shared##name;
// .m文件
#define HCSingletonM(name) \
static id _instance; \
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
if (!_instance) { \
_instance = [[self alloc] init]; \
} \
}); \
return _instance; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
if (!_instance) { \
_instance = [[self alloc] init]; \
} \
}); \
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instance; \
}
實(shí)際定義單例
// .h
#import <Foundation/Foundation.h>
#import "HCSingleton.h"
@interface Test : NSObject
HCSingletonH(Test)
@end
// .m
#import "Test.h"
@implementation Test
HCSingletonM(Test)
@end
使用單例
// .h
#import "Test.h"
NSLog(@"%@", [Test sharedTest]);
TCP和UDP的區(qū)別是什么?
http://blog.csdn.net/li_ning_/article/details/52117463
MD5和Base64的區(qū)別是什么,各自場(chǎng)景是什么?
MD5:只能加密不能解密,用于用戶名密碼的加密,文件校驗(yàn)
Base64:公開的加密和解密,用于URL加密
二叉搜索樹的概念,時(shí)間復(fù)雜度多少?
若左子樹不為空,則左子樹所有節(jié)點(diǎn)均比跟節(jié)點(diǎn)小,若右子樹不為空,則右子樹所有節(jié)點(diǎn)均比根節(jié)點(diǎn)大
時(shí)間復(fù)雜度為樹高O(log(n))