CRM, SCRM, ERP, OA管理系统
定义CRM:Customer Relationship Management,是客户关系管理;SCRM:Social Customer Relation Management,是社会化客户关系管理;ERP: Enterprie Resource Planning,是企业管理计划;OA:Office Automation,是办公自动化;
功能分析CRMCRM能让你知道你的客户在哪里(售前市场调查),能让你知道你的产品哪个更畅销(产品销售分析),能让你知道团队的工作情况(销售行动记录),能让你知道哪个地区、哪个行业或哪种类型的客户理愿意和你合作(客户分析),能让你知道企业明年大概能赚多少钱(销售预测),能让你知道公司的整个运营情况(管理驾驶舱),能让一个公司拥有记忆(比如去年做了多少销量,销量上升/下降了几个百分点,上个月的促销产生了多少商机和潜在客户),能自动化处理销售相关流程(即用工作流+SFA的方式实现售后服务自动通知,节假日客户关系维系、各种流程审批等)。
SCRM人人社交的时代背景下,企业与用户关系已经发生了变化,有效的用户关系管理,应当有更进一步的用户关系,于是就诞生 ...
内存管理-自动释放池(AutoReleasePool)
定义
AutoReleasePool是Objective—C中一种内存自动回收的机制,他可以将加入AutoReleasePool中的变量release的时机延迟。也就是说,当你创建一个对象,在正常情况下,变量会在超出其作用域的时候立即release,如果将该对象加入到自动释放池中,这个对象并不会立即释放,而是等到runloop休眠或者超出AutoReleasePool的作用域{}之后才会被释放。
本质:
autorelease本质就是延迟调用release方法
MRC环境下,通过[obj autorelease]来延迟内存的释放
ARC环境下,是不能手动调用,系统会自动给对象添加autorelease
自动释放池的主要底层数据结构是:__AtAutoreleasePool、AutoreleasePoolPage
调用了autorelease的对象最终都是通过AutoreleasePoolPage对象来管理的
示例:
1234567891011121314151617181920212223242526int main(int argc, char * argv[]) ...
内存管理-copy,引用计数,delloc
内存管理释义
在iOS中,使用引用计数来管理OC对象的内存
一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间
调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1
内存管理的经验总结
当调用alloc、new、copy、mutableCopy方法返回了一个对象,在不需要这个对象时,要调用release或者autorelease来释放它
想拥有某个对象,就让它的引用计数+1;不想再拥有某个对象,就让它的引用计数-1
可以通过以下私有函数来查看自动释放池的情况1extern void _objc_autoreleasePoolPrint(void);
深拷贝、浅拷贝
拷贝的目的:产生一个副本对象,跟源对象互不影响
修改了源对象,不会影响副本对象
修改了副本对象,不会影响源对象
iOS提供了2个拷贝方法
copy,不可变拷贝,产生不可变副本
mutableCopy,可变拷贝,产生可变副本
深拷贝和浅拷贝
深拷贝:内容拷贝,产生新的对象
浅拷贝:指针拷贝,没有产生新的对象
copy
m ...
内存管理-内存布局, Tagged Pointer
内存布局
代码段:编译之后的代码
数据段
字符串常量:比如NSString *str = @”123”
已初始化数据:已初始化的全局变量、静态变量等
未初始化数据:未初始化的全局变量、静态变量等
栈:函数调用开销,比如局部变量。分配的内存空间地址越来越小
堆:通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大
代码示例:
12345678910111213141516171819202122232425262728293031323334353637383940414243int a = 10;int b;int main(int argc, char * argv[]) { @autoreleasepool { static int c = 20; static int d; int e; int f = 20; NSString *str = @"123"; ...
内存管理-CADisplayLink, NSTimer
CADisplayLink定义
一个定时器对象,它可以让你与屏幕刷新频率相同的速率来刷新你的视图。就说CADisplayLink是用于同步屏幕刷新频率的计时器。
在应用中创建一个新的CADisplayLink对象,把它添加到一个runloop中,并给它提供一个target和selector在屏幕刷新的时候调用。
API123456789101112131415//初始化 + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel; //启动 //初始化后,要将其添加到 runLoop 中才能执行 - (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode //添加到runLoop- (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode //从runLoop中移除//暂停和继续[link setPaused:YES];[link setPaused ...
多线程 - 同步文案二
iOS中的线程同步方案NSCondition
NSCondition是对mutex和cond的封装
用法
1234567@interface NSCondition: NSObject<NSLocking> {- (void)wait;- (BOOL)waitUntilDate:(NSDate *)limit;- (void)signal;- (void)broadcast;}@end
示例:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#import "NSConditionDemo.h"@interface NSConditionDemo()@property (strong, nonatomic) NSCondition *condition;@property (strong, nonatomic) NSMutableArray * ...
多线程 - 同步方案一
多线程的安全隐患
资源共享
1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
比如多个线程访问同一个对象、同一个变量、同一个文件
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
多线程的安全隐患的解决方案
解决方案:使用线程同步技术(同步,就是协同步调,按预定的先后次序进行)
常见的线程同步技术是:加锁
iOS中的线程同步方案
OSSpinLock
os_unfair_lock
pthread_mutex
dispatch_semaphore
dispatch_queue(DISPATCH_QUEUE_SERIAL)
NSLock
NSRecursiveLock
NSCondition
NSConditionLock
@synchronized
OSSpinLock
OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源
目前已经不再安全,可能会出现优先级反转问题
如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁
需要导入头文件#import <libker ...
多线程 - 原理机制
线程与进程线程定义
线程是进程的基本执行单元,一个进程的所有任务都是在线程中执行
进行要执行任务,必须得有线程,进行至少有一条线程
程序启动会默认开启一条线程,这条线程被称为主线程/UI线程
进程定义
进程是系统进行资源和高度的基本单位
在移动端进程是指在系统中正在运行的一个程序
每个进程之间是独立的,每个进程均运行在专用的且受保护的内存中
进程与线程的关系
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间
资源拥有:同一进程内的线程共享本进程的资源内存、I/O、CPU等,但是进程之间的资源是独立的
相互影响:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃后整个进程就死掉了,所以多进程要比多线程健壮
资源占用:进程切换时资源消耗大,效率高;所以涉及到频繁切换时,使用线程要好于进程,同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程
执行过程:每个独立的进程有一个程序入口、顺序执行序列和程序出口。但是线程不能独立执行,必须存在应用程序中(进程),有应用程序提供多个线程执行控制(多线程开发)
线 ...
Runloop原理机制
定义
顾名思义
运行循环
在程序运行过程中循环做一些事情
应用范畴
定时器(Timer),PerformSelector
GCD Async Main Queue
事件响应,手势识别,界面刷新
网络请求
AutoreleasePool
如果没有RunLoop,执行完13行代码之后,会退出程序
123456int main(int argc, const char* argv[]) { @autoreleasepool { NSLog(@"Hello World!") } return 0;}
如果有了RunLoop
12345678910111213141516171819int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class] ...
Runtime - API及应用
API-01-类
动态创建一个类(参数:父类,类名,额外的内存空间)Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes)
注册一个类(要在类注册之前添加成员变量)void objc_registerClassPair(Class cls)
销毁一个类void objc_disposeClassPair(Class cls)
获取isa指向的ClassClass object_getClass(id obj)
设置isa指向的ClassClass object_setClass(id obj, Class cls)
判断一个OC对象是否为ClassBOOL object_isClass(id obj)
判断一个Class是否为元类BOOL class_isMetaClass(Class cls)
获取父类Class class_getSuperclass(Class cls)
示例:
12345678910111213141516171819 ...






