- NSLog效率低下的原因(http://blog.sunnyxx.com/2014/04/22/objc_dig_nslog/)
image.png
- NSLog被设计为error log,是ASL的高层封装
-
OS 中集合遍历方法(http://blog.sunnyxx.com/2014/04/30/ios_iterator/)
image.png
可读性效率相权衡 -
atomic一定是线程安全的吗?
atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的。如下列所示:
比如:@property(atomic,strong)NSMutableArray *arr;
如果一个线程循环的读数据,一个线程循环写数据,那么肯定会产生内存问题,因为这和setter、getter没有关系。如使用[self.arr objectAtIndex:index]就不是线程安全的。好的解决方案就是加锁。 -
已经有了__weak 为什么还要保留 __unsafe_unretained ?
__unsafe_unretained 主要跟 C 代码交互,对象即使被销毁,指针也不会自动置空(set nil)。另外 __weak 是有代价的,需要检查对象是否已经消亡,而为了知道是否已经消亡,自然也需要一些信息去跟踪对象的使用情况。__unsafe_unretained 比 __weak 快。当明确知道对象的生命期时,选择 __unsafe_unretained 会有一些性能提升。当 A 拥有 B 对象,当 A 消亡时 B 也消亡。这样当 B 存在,A 就一定会存在。而 B 又要调用 A 的接口时,B 就可以存储 A 的 __unsafe_unretained 指针。比如 MyViewController 拥有 MyView, MyView 需要调用 MyViewController 的接口。MyView 中就可以存储 __unsafe_unretained MyViewController* _viewController。 -
Heap-Stack Dance 避开循环引用
-
ARC怎么知道生成的对象是不是autorelease的呢?(http://blog.sunnyxx.com/2014/03/15/objc_arc_secret/)
- Method family :指的是命名上表示一类型的方法,比如- init和- initWithMark:都属于init的family
于是乎,编译器约定,对于alloc,init,copy,mutableCopy,new这几个家族的方法,后面默认加NS_RETURNS_RETAINED标识;而其他不指名标识的family的方法默认添加NS_RETURNS_NOT_RETAINED标识。如下:@interface Sark : NSObject + (instancetype)sarkWithMark:(NSString *)mark NS_RETURNS_NOT_RETAINED; // 1 - (instancetype)initWithMark:(NSString *)mark NS_RETURNS_RETAINED; // 2 @end
于是sarkWithMark
返回一个autorelease对象,init返回一个
-
dealloc过程的解释
image.png -
Autorelease相关问题
8.0 Autorelease原理
a) Autorelease是一种内存自动管理方案,@autoreleasepool{}。
b) AutoreleasePoolPage双向链表用以实现pool结构,在push时加入哨兵对象。
c) 释放时从哨兵对象开始到next指针的所有对象都接收release消息。
8.1 Autorelease对象什么时候释放?
在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的
8.2 Autorelease返回值的快速释放机制
a) Thread Local Storage(TLS)线程局部存储
b) 举例objc_autoreleaseReturnValue
方法时,runtime将这个返回值object储存在TLS中;objc_retainAutoreleasedReturnValue
里,发现TLS中正好存了这个对象,那么直接返回这个object+ (instancetype)createSark { return [self new]; } // caller Sark *sark = [Sark createSark]; //编译器翻译 + (instancetype)createSark { id tmp = [self new]; return objc_autoreleaseReturnValue(tmp); // 代替我们调用autorelease } // caller id tmp = objc_retainAutoreleasedReturnValue([Sark createSark]) // 代替我们调用retain Sark *sark = tmp; objc_storeStrong(&sark, nil); // 相当于代替我们调用了release
8.3 应用举例
a)[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { // 这里被一个局部@autoreleasepool包围着 }];
-
预编译宏的用法
-
reflection (https://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful)
image.png
网友评论