Effective-OC 2.0

OC通过一套全新的语法,在C语言的基础上添加了面向对象的特性。
消息结果与函数调用区别在于:使用消息结构的语言,其运行时执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器来决定。(函数调用的方式也提供了动态绑定,那就是多态)
编译期没有计算偏移量,运行时把每个类加载进内存,每个属性和方法都存在于映射表中。正是因为这个机制,所以分类和运行时编程才诞生。

UIAlertView增加参数可以通过,运行时关联属性来达到目的。(变量或者block)
但是这种不好,最好还是用继承的方式增加属性。

第四条:少用预处理指令

static const NSTimeInterval kAnimationDuration = 0.3;

类全局变量的static修饰符作用域是编译单元内;不加,编译器为他建一个外部符号,另一个编译单元同名会冲突。实际上static+const,编译器不会建符号,直接替换。
函数内的static作用域在函数内,但是存在于全局变量区会记录上次值。
类中的static函数只能本类调用,所以不会生成符号表,利于反编译。

作用域为整个工程的全局符号

// EOCAnimatedView.h
extern const NSTimeInterval EOCAnimatedViewAnimationDuration;
// EOCAnimatedView.m
const NSTimeInterval EOCAnimatedViewAnimationDuration = 0.3;

第五条:枚举的善用
NS_ENUM 全部情况
NS_OPTIONS 各种选项,可以自由组合
枚举用switch进行分之判断的时候,别用default分之。这样的话,增加一个状态,编译器会报警告。

第十二条:消息转发机制
方法列表找不到

+ (BOOL)resolveInstanceMethod:(SEL)selector
+ (BOOL)resolveClassMethod:(SEL)selector

选择其他接受者
- (id)forwardingTargetForSelector:(SEL)selector

转发其他接受者
- (void)forwardInvocation:(NSInvocation*)invocation

第二十七条:匿名类隐藏实现细节
头文件中引入了C++文件,会造成这个类被编译成C++文件。如果别人再引入这个文件,影响的范围会很大。
所以引入C++文件的时候,把他放在.m文件中,这样编译的时候就只会影响自身。
头文件的属性只读,匿名类可以修改成可写。

对象关联
把对象本身当做字典,把关联到对象的属性理解为key。但是这个key是不透明的指针,后面如果需要取出这个key的值,我们需要用到这个key,所以把key定义为静态全局变量。
- (void)setCyj:(NSString *)cyj
{
objc_setAssociatedObject(self,@selector(cyj),cyj,OBJC_ASSOCIATION_COPY_NONATOMIC);
//关联的key是getter方法的消息,所以getter方式的key可以直接是cmd
}
- (NSString *)cyj
{
return objc_getAssociatedObject(self, _cmd);
}

GCD
1、可以用串行队列代替互斥锁

_syncQueue = dispatch_queue_create("com.effectiveobjectivec.syncQueue", NULL);

- (NSString*)someString {
     __block NSString *localSomeString;
     dispatch_sync(_syncQueue, ^{
          localSomeString = _someString;
     });
     return localSomeString;
}
- (void)setSomeString:(NSString*)someString {
     dispatch_sync(_syncQueue, ^{
          _someString = someString;
     });
}

写操作的可以用同步或者异步,但是异步会是copy一份block内容,所以在copy的消耗和执行时间的消耗之间选择。

2、并行队列

_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

如果需要队列元素单独执行,可以使用栅栏

void dispatch_barrier_async(dispatch_queue_t queue,dispatch_block_t block);
void dispatch_barrier_sync(dispatch_queue_t queue,dispatch_block_t block);

3、GCD 比 performSelector 好,因为performSelector 传递的参数很局限,而且ARC内存释放也做不到。

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
dispatch_after(time, dispatch_get_main_queue(), ^(void){
     [self doSomething];
});

4、GCD 和 操作队列
GCD是纯C的API,操作队列是在GCD上封装的OC。
操作队列好处:1.可以取消某个操作。2.指定元素之间的依赖关系。3.KVO监测NSOperation的属性。4.指定优先级。

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

推荐阅读更多精彩内容