iOS 進(jìn)階+面試(一)

這篇文章可能有點(diǎn)長(zhǎng)辛慰,所以分了三篇文章記錄探熔。內(nèi)容來(lái)自網(wǎng)上的面試題以及自己面試過(guò)程中遇到的問(wèn)題總結(jié),也會(huì)定期更新,不合理的地方歡迎指正岔擂。

一、分類和擴(kuò)展

  • 分類和擴(kuò)展有什么區(qū)別棺棵?

category

1毫别、分類給類添加方法
2、不能通過(guò)正常模式給類添加屬性辟汰,但是可以通過(guò) runtime 添加
3列敲、如果在分類中通過(guò)@property定義屬性,那么只會(huì)對(duì)屬性的 getter setter 方法進(jìn)行聲明帖汞,不會(huì)實(shí)現(xiàn)戴而。同時(shí)也不會(huì)生成帶下劃線的成員變量
4、在運(yùn)行時(shí)才會(huì)編譯代碼

extension

1涨冀、擴(kuò)展可以看成是特殊的分類 匿名分類
2填硕、可以給類添加屬性,私有
3鹿鳖、可以給類添加方法扁眯,也是私有
4、在編譯時(shí)期就會(huì)編譯翅帜,與 .h 文件中的@interface和.m文件里的@implement一起形成了一個(gè)完整的類
5姻檀、擴(kuò)展一般用來(lái)隱藏類的信息,所以使用擴(kuò)展的前提是要有類的源碼涝滴!所以針對(duì)系統(tǒng)自帶的類绣版,是無(wú)法使用擴(kuò)展的。

為什么分類可以添加方法歼疮,而不能添加成員變量杂抽??韩脏?

因?yàn)樵谶\(yùn)行時(shí)缩麸,類的內(nèi)部布局早已經(jīng)確定,如果添加實(shí)例變量赡矢,會(huì)破壞類的內(nèi)部布局杭朱。
  • 分類的結(jié)構(gòu)體里面有哪些成員?

category 是一個(gè)指向類結(jié)構(gòu)體的指針吹散,其結(jié)構(gòu)體的定義如下:

typedef struct objc_category *Category;

struct objc_category {
    char *category_name                          OBJC2_UNAVAILABLE; // 分類名
    char *class_name                             OBJC2_UNAVAILABLE; // 分類所屬的類名
    struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 實(shí)例方法列表
    struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 類方法列表
    struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分類所實(shí)現(xiàn)的協(xié)議列表
}

可以 與 objc_class 的結(jié)構(gòu)體進(jìn)行對(duì)比:

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
    Class super_class                       OBJC2_UNAVAILABLE;  // 父類
    const char *name                        OBJC2_UNAVAILABLE;  // 類名
    long version                            OBJC2_UNAVAILABLE;  // 類的版本信息弧械,默認(rèn)為0
    long info                               OBJC2_UNAVAILABLE;  // 類信息,供運(yùn)行期使用的一些位標(biāo)識(shí)
    long instance_size                      OBJC2_UNAVAILABLE;  // 該類的實(shí)例變量大小
    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 該類的成員變量鏈表
    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定義的鏈表
    struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法緩存
    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 協(xié)議鏈表
#endif
} OBJC2_UNAVAILABLE;

經(jīng)過(guò)對(duì)比空民,發(fā)現(xiàn)少了一個(gè) struct objc_ivar_list *ivars 成員變量列表H刑啤!!這也就說(shuō)明了 分類是不能添加成員變量的唁桩。

  • 分類加載和方法調(diào)用順序

    1闭树、 加載:先加載原始類的 load() 方法 ,再去加載 分類中的 load() 方法荒澡,如果有多個(gè)分類报辱,則按照編譯順序加載

    2、調(diào)用:先調(diào)用分類中的方法单山,再去調(diào)用原始類中的方法碍现,如果要是重名,則會(huì)覆蓋原始類中的方法(因?yàn)樵诜椒斜碇忻准椋诸惖姆椒〞?huì)排在原始類中同名方法的前面)昼接。

二、atomic的實(shí)現(xiàn)機(jī)制悴晰;為什么不能保證絕對(duì)的線程安全(最好可以結(jié)合場(chǎng)景來(lái)說(shuō))慢睡?

  • atomic

atomic

1、會(huì)對(duì)屬性的 setter/getter 方法進(jìn)行加鎖铡溪,這僅僅只能保證在 操作 setter/getter 方法是安全的漂辐。不能保證其他線程的安全
2、例如 : 線程1調(diào)用了某一屬性的setter方法并進(jìn)行到了一半,線程2調(diào)用其getter方法,那么會(huì)執(zhí)行完setter操作后,在執(zhí)行g(shù)etter操作,線程2會(huì)獲取到線程1 setter后的完整的值.
3棕硫、當(dāng)幾個(gè)線程同時(shí)調(diào)用同一屬性的setter髓涯、getter方法時(shí),會(huì)get到一個(gè)完整的值,但get到的值不可控。

例如 : 線程1 調(diào)用getter 哈扮,線程2 調(diào)用setter纬纪,線程3 調(diào)用setter,這3個(gè)線程并行同時(shí)開(kāi)始,線程1會(huì)get到一個(gè)值,但是這個(gè)值不可控,可能是線程2,線程3 set之前的原始值,可能是線程2 set的值,也可能是線程3 set的值

  • atomic是線程安全的嗎?

不是,很多文章談到atomic和nonatomic的區(qū)別時(shí),都說(shuō)atomic是線程安全,其實(shí)這個(gè)說(shuō)法是不準(zhǔn)確的.atomic只是對(duì)屬性的getter/setter方法進(jìn)行了加鎖操作,這種安全僅僅是set/get 的讀寫(xiě)安全,并非真正意義上的線程安全,因?yàn)榫€程安全還有讀寫(xiě)之外的其他操作

比如:如果當(dāng)一個(gè)線程正在get或set時(shí),又有另一個(gè)線程同時(shí)在進(jìn)行release操作,可能會(huì)直接crash
  • nonatomic

nonatomic

系統(tǒng)生成的getter/setter方法沒(méi)有加鎖線程不安全,但更快當(dāng)多個(gè)線程同時(shí)訪問(wèn)同一個(gè)屬性,會(huì)出現(xiàn)無(wú)法預(yù)料的結(jié)果

  • atomic的seter getter內(nèi)部實(shí)現(xiàn)
- (void)setCurrentImage:(UIImage *)currentImage
{
    @synchronized(self) {
        if (_currentImage != currentImage) {
            [_currentImage release];
            _currentImage = [currentImage retain];

        }
    }
}

- (UIImage *)currentImage
{
    @synchronized(self) {
        return _currentImage;
    }
}

  • nonatomic的seter getter內(nèi)部實(shí)現(xiàn)
- (void)setCurrentImage:(UIImage *)currentImage
{
    if (_currentImage != currentImage) {
        [_currentImage release];
        _currentImage = [currentImage retain];

    }
}
- (UIImage *)currentImage
{
    return _currentImage;
}

三滑肉、被weak修飾的對(duì)象在被釋放的時(shí)候會(huì)發(fā)生什么包各?是如何實(shí)現(xiàn)的?知道sideTable么靶庙?里面的結(jié)構(gòu)可以畫(huà)出來(lái)么髓棋?

參考:http://www.reibang.com/p/b93d61418f17
這個(gè)問(wèn)題在 數(shù)據(jù)結(jié)構(gòu)&&算法里面做了解答

四、關(guān)聯(lián)對(duì)象有什么應(yīng)用惶洲,系統(tǒng)如何管理關(guān)聯(lián)對(duì)象?其被釋放的時(shí)候需要手動(dòng)將其指針置空么膳犹?

我們?cè)?iOS 開(kāi)發(fā)中經(jīng)常需要使用分類(Category)恬吕,為已經(jīng)存在的類添加屬性的需求,但是使用 @property 并不能在分類中正確創(chuàng)建實(shí)例變量和存取方法须床。這時(shí)候就會(huì)用到關(guān)聯(lián)對(duì)象铐料。

分類中的 @property
@interface DKObject : NSObject

@property (nonatomic, strong) NSString *property;

@end

在使用上述代碼時(shí)會(huì)做三件事:

  • 生成帶下劃線的實(shí)例變量 _property
  • 生成 getter 方法 - property
  • 生成 setter 方法 - setProperty:
@implementation DKObject {
    NSString *_property;
}

- (NSString *)property {
    return _property;
}

- (void)setProperty:(NSString *)property {
    _property = property;
}

@end

這些代碼都是編譯器為我們生成的,雖然你看不到它,但是它確實(shí)在這里钠惩,我們既然可以在類中使用 @property 生成一個(gè)屬性柒凉,那么為什么在分類中不可以呢?

我們來(lái)做一個(gè)小實(shí)驗(yàn):創(chuàng)建一個(gè) DKObject 的分類 Category篓跛,并添加一個(gè)屬性 categoryProperty

@interface DKObject (Category)

@property (nonatomic, strong) NSString *categoryProperty;

@end

看起來(lái)還是很不錯(cuò)的膝捞,不過(guò) Build 一下這個(gè) Demo,會(huì)發(fā)現(xiàn)有這么一個(gè)警告:

1975281-b76dd29743ae996a.png.jpeg

在這里的警告告訴我們 categoryProperty 屬性的存取方法需要自己手動(dòng)去實(shí)現(xiàn)愧沟,或者使用 @dynamic 在運(yùn)行時(shí)實(shí)現(xiàn)這些方法蔬咬。

換句話說(shuō),分類中的 @property 并沒(méi)有為我們生成實(shí)例變量以及存取方法沐寺,而需要我們手動(dòng)實(shí)現(xiàn)林艘。

使用關(guān)聯(lián)對(duì)象

Q:我們?yōu)槭裁匆褂藐P(guān)聯(lián)對(duì)象?

A:因?yàn)樵诜诸愔?@property 并不會(huì)自動(dòng)生成實(shí)例變量以及存取方法混坞,所以一般使用關(guān)聯(lián)對(duì)象為已經(jīng)存在的類添加『屬性』狐援。

以下是與關(guān)聯(lián)對(duì)象有關(guān)的 API,并在分類中實(shí)現(xiàn)一個(gè)偽屬性:

#import "DKObject+Category.h"
#import <objc/runtime.h>

@implementation DKObject (Category)

- (NSString *)categoryProperty {
    return objc_getAssociatedObject(self, _cmd);
}

- (void)setCategoryProperty:(NSString *)categoryProperty {
    objc_setAssociatedObject(self, @selector(categoryProperty), categoryProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

這里的 _cmd 代指當(dāng)前方法的選擇子究孕,也就是 @selector(categoryProperty)啥酱。

我們使用了兩個(gè)方法 objc_getAssociatedObject 以及 objc_setAssociatedObject 來(lái)模擬『屬性』的存取方法,而使用關(guān)聯(lián)對(duì)象模擬實(shí)例變量蚊俺。

在這里有必要解釋兩個(gè)問(wèn)題:

  • 為什么向方法中傳入 @selector(categoryProperty)懈涛?
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC 是干什么的?

關(guān)于第一個(gè)問(wèn)題泳猬,我們需要看一下這兩個(gè)方法的原型:

id objc_getAssociatedObject(id object, const void *key);
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);

@selector(categoryProperty) 也就是參數(shù)中的key批钠,其實(shí)可以使用靜態(tài)指針 static void *類型的參數(shù)來(lái)代替,不過(guò)在這里得封,筆者強(qiáng)烈推薦使用 @selector(categoryProperty) 作為 key 傳入埋心。因?yàn)檫@種方法省略了聲明參數(shù)的代碼,并且能很好地保證 key 的唯一性忙上。

OBJC_ASSOCIATION_RETAIN_NONATOMIC 又是什么呢拷呆?如果我們使用 Command 加左鍵查看它的定義:

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
                                            *   The association is made atomically. */
    OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.
                                            *   The association is made atomically. */
};

從這里的注釋我們能看到很多東西,也就是說(shuō)不同的 objc_AssociationPolicy 對(duì)應(yīng)了不通的屬性修飾符:

objc_AssociationPolicy modifier
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_RETAIN_NONATOMIC nonatomic, strong
OBJC_ASSOCIATION_COPY_NONATOMIC nonatomic, copy
OBJC_ASSOCIATION_RETAIN atomic, strong
OBJC_ASSOCIATION_COPY atomic, copy

而我們?cè)诖a中實(shí)現(xiàn)的屬性 categoryProperty 就相當(dāng)于使用了 nonatomic 和 strong 修飾符疫粥。

在obj dealloc時(shí)候會(huì)調(diào)用object_dispose茬斧,檢查有無(wú)關(guān)聯(lián)對(duì)象,有的話_object_remove_assocations刪除

五梗逮、KVO的底層實(shí)現(xiàn)项秉?如何取消系統(tǒng)默認(rèn)的KVO并手動(dòng)觸發(fā)(給KVO的觸發(fā)設(shè)定條件:改變的值符合某個(gè)條件時(shí)再觸發(fā)KVO)?

實(shí)現(xiàn)原理:


kvo原理圖.png
  • 當(dāng)某個(gè)類的對(duì)象第一次被觀察時(shí)慷彤,系統(tǒng)就會(huì)在運(yùn)行期動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類娄蔼,在這個(gè)派生類中重寫(xiě)基類中任何被觀察屬性的 setter 方法怖喻。
  • 派生類在被重寫(xiě)的 setter 方法中實(shí)現(xiàn)真正的通知機(jī)制,就如前面手動(dòng)實(shí)現(xiàn)鍵值觀察那樣岁诉。這么做是基于設(shè)置屬性會(huì)調(diào)用 setter 方法锚沸,而通過(guò)重寫(xiě)就獲得了 KVO 需要的通知機(jī)制。當(dāng)然前提是要通過(guò)遵循 KVO 的屬性設(shè)置方式來(lái)變更屬性值涕癣,如果僅是直接修改屬性對(duì)應(yīng)的成員變量哗蜈,是無(wú)法實(shí)現(xiàn) KVO 的。
  • 同時(shí)派生類還重寫(xiě)了 class 方法以“欺騙”外部調(diào)用者它就是起初的那個(gè)類属划。然后系統(tǒng)將這個(gè)對(duì)象的 isa 指針指向這個(gè)新誕生的派生類恬叹,因此這個(gè)對(duì)象就成為該派生類的對(duì)象了,因而在該對(duì)象上對(duì) setter 的調(diào)用就會(huì)調(diào)用重寫(xiě)的 setter同眯,從而激活鍵值通知機(jī)制绽昼。此外,派生類還重寫(xiě)了 dealloc 方法來(lái)釋放資源须蜗。

KVO與Notification之間的區(qū)別:

  • notification是需要一個(gè)發(fā)送notification的對(duì)象硅确,一般是notificationCenter,來(lái)通知觀察者明肮。

  • KVO是直接通知到觀察對(duì)象菱农,并且邏輯非常清晰,實(shí)現(xiàn)步驟簡(jiǎn)單柿估。

六循未、Autoreleasepool所使用的數(shù)據(jù)結(jié)構(gòu)是什么?AutoreleasePoolPage結(jié)構(gòu)體了解么秫舌?


每創(chuàng)建一個(gè)池子足陨,會(huì)在首部創(chuàng)建一個(gè) 哨兵 對(duì)象,作為標(biāo)記

最外層池子的頂端會(huì)有一個(gè)next指針嫂粟。當(dāng)鏈表容量滿了,就會(huì)在鏈表的頂端墨缘,并指向下一張表星虹。

Autorelease對(duì)象什么時(shí)候釋放?

這個(gè)問(wèn)題拿來(lái)做面試題镊讼,問(wèn)過(guò)很多人宽涌,沒(méi)有幾個(gè)能答對(duì)的。很多答案都是“當(dāng)前作用域大括號(hào)結(jié)束時(shí)釋放”蝶棋,顯然木有正確理解Autorelease機(jī)制卸亮。

在沒(méi)有手加Autorelease Pool的情況下,Autorelease對(duì)象是在當(dāng)前的runloop迭代結(jié)束時(shí)釋放的嚼松,而它能夠釋放的原因是系統(tǒng)在每個(gè)runloop迭代中都加入了自動(dòng)釋放池Push和Pop

例子:

__weak id reference = nil;
- (void)viewDidLoad {
    [super viewDidLoad];    NSString *str = [NSString stringWithFormat:@"sunnyxx"];    // str是一個(gè)autorelease對(duì)象嫡良,設(shè)置一個(gè)weak的引用來(lái)觀察它
    reference = str;
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];    
    NSLog(@"%@", reference); 
    // Console: sunnyxx
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];    
    NSLog(@"%@", reference); 
    // Console: (null)
}

當(dāng)然,我們也可以手動(dòng)干預(yù)Autorelease對(duì)象的釋放時(shí)機(jī):

- (void)viewDidLoad
{
    [super viewDidLoad];
    @autoreleasepool {        NSString *str = [NSString stringWithFormat:@"sunnyxx"];
    }    NSLog(@"%@", str); 
// Console: (null)
}
Autorelease原理

AutoreleasePoolPage

ARC下献酗,我們使用@autoreleasepool{}來(lái)使用一個(gè)AutoreleasePool寝受,隨后編譯器將其改寫(xiě)成下面的樣子:

void *context = objc_autoreleasePoolPush();
// {}中的代碼objc_autoreleasePoolPop(context);

而這兩個(gè)函數(shù)都是對(duì)AutoreleasePoolPage的簡(jiǎn)單封裝,所以自動(dòng)釋放機(jī)制的核心就在于這個(gè)類罕偎。

AutoreleasePoolPage是一個(gè)C++實(shí)現(xiàn)的類


1402395151-0.jpg
  • AutoreleasePool并沒(méi)有單獨(dú)的結(jié)構(gòu)很澄,而是由若干個(gè)AutoreleasePoolPage以雙向鏈表的形式組合而成(分別對(duì)應(yīng)結(jié)構(gòu)中的parent指針和child指針)。
  • AutoreleasePool是按線程一一對(duì)應(yīng)的(結(jié)構(gòu)中的thread指針指向當(dāng)前線程)颜及。
  • AutoreleasePoolPage每個(gè)對(duì)象會(huì)開(kāi)辟4096字節(jié)內(nèi)存(也就是虛擬內(nèi)存一頁(yè)的大兴痢),除了上面的實(shí)例變量所占空間俏站,剩下的空間全部用來(lái)儲(chǔ)存autorelease對(duì)象的地址讯蒲。
  • 上面的id *next指針作為游標(biāo)指向棧頂最新add進(jìn)來(lái)的autorelease對(duì)象的下一個(gè)位置
  • 一個(gè)AutoreleasePoolPage的空間被占滿時(shí)肄扎,會(huì)新建一個(gè)AutoreleasePoolPage對(duì)象墨林,連接鏈表,后來(lái)的autorelease對(duì)象在新的page加入犯祠。

所以旭等,若當(dāng)前線程中只有一個(gè)AutoreleasePoolPage對(duì)象,并記錄了很多autorelease對(duì)象地址時(shí)內(nèi)存如下圖:


1402396457-1.jpg

圖中的情況衡载,這一頁(yè)再加入一個(gè)autorelease對(duì)象就要滿了(也就是next指針馬上指向棧頂)搔耕,這時(shí)就要執(zhí)行上面說(shuō)的操作,建立下一頁(yè)page對(duì)象痰娱,與這一頁(yè)鏈表連接完成后弃榨,新page的next指針被初始化在棧底(begin的位置),然后繼續(xù)向棧頂添加新對(duì)象猜揪。

所以惭墓,向一個(gè)對(duì)象發(fā)送- autorelease消息,就是將這個(gè)對(duì)象加入到當(dāng)前AutoreleasePoolPage的棧頂next指針指向的位置

釋放時(shí)刻

每當(dāng)進(jìn)行一次objc_autoreleasePoolPush調(diào)用時(shí)而姐,runtime向當(dāng)前的AutoreleasePoolPage中add進(jìn)一個(gè)哨兵對(duì)象腊凶,值為0(也就是個(gè)nil),那么這一個(gè)page就變成了下面的樣子:

1402391c4-2.jpg

objc_autoreleasePoolPush的返回值正是這個(gè)哨兵對(duì)象的地址拴念,被objc_autoreleasePoolPop(哨兵對(duì)象)作為入?yún)⒕迹谑牵?/p>

1.根據(jù)傳入的哨兵對(duì)象地址找到哨兵對(duì)象所處的page

2.在當(dāng)前page中,將晚于哨兵對(duì)象插入的所有autorelease對(duì)象都發(fā)送一次- release消息政鼠,并向回移動(dòng)next指針到正確位置

3.補(bǔ)充2:從最新加入的對(duì)象一直向前清理风瘦,可以向前跨越若干個(gè)page,直到哨兵所在的page(在一個(gè)page中公般,是從高地址向低地址清理)

剛才的objc_autoreleasePoolPop執(zhí)行后万搔,最終變成了下面的樣子:


1402392N7-3.jpg
嵌套的AutoreleasePool

知道了上面的原理胡桨,嵌套的AutoreleasePool就非常簡(jiǎn)單了,pop的時(shí)候總會(huì)釋放到上次push的位置為止瞬雹,多層的pool就是多個(gè)哨兵對(duì)象而已昧谊,就像剝洋蔥一樣,每次一層酗捌,互不影響呢诬。

七、class_ro_t 和 class_rw_t 的區(qū)別胖缤?

Class的結(jié)構(gòu)
1345141-1c9a3f46caca5efc.png
class_rw_t

class_rw_t里面的methods尚镰、properties、protocols是二維數(shù)組哪廓,是可讀可寫(xiě)的狗唉,包含了類的初始內(nèi)容、分類的內(nèi)容

1345141-92396f3642e690d1.png
class_ro_t

class_ro_t里面的baseMethodList撩独、baseProtocols敞曹、ivars、baseProperties是一維數(shù)組综膀,是只讀的澳迫,包含了類的初始內(nèi)容


1345141-723fbcb1a1be35eb.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剧劝,隨后出現(xiàn)的幾起案子橄登,更是在濱河造成了極大的恐慌,老刑警劉巖讥此,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拢锹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萄喳,警方通過(guò)查閱死者的電腦和手機(jī)卒稳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)他巨,“玉大人充坑,你說(shuō)我怎么就攤上這事∪就唬” “怎么了捻爷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)份企。 經(jīng)常有香客問(wèn)我也榄,道長(zhǎng),這世上最難降的妖魔是什么司志? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任甜紫,我火速辦了婚禮降宅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囚霸。我一直安慰自己钉鸯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布邮辽。 她就那樣靜靜地躺著,像睡著了一般贸营。 火紅的嫁衣襯著肌膚如雪吨述。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天钞脂,我揣著相機(jī)與錄音揣云,去河邊找鬼。 笑死冰啃,一個(gè)胖子當(dāng)著我的面吹牛邓夕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阎毅,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼焚刚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扇调?” 一聲冷哼從身側(cè)響起矿咕,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狼钮,沒(méi)想到半個(gè)月后碳柱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熬芜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年莲镣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涎拉。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑞侮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曼库,到底是詐尸還是另有隱情区岗,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布毁枯,位于F島的核電站慈缔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏种玛。R本人自食惡果不足惜藐鹤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一瓤檐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娱节,春花似錦挠蛉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稠歉,卻和暖如春掰担,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怒炸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工带饱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阅羹。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓勺疼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捏鱼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子执庐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 面向?qū)ο蟮娜筇匦裕悍庋b、繼承导梆、多態(tài) OC內(nèi)存管理 _strong 引用計(jì)數(shù)器來(lái)控制對(duì)象的生命周期耕肩。 _weak...
    運(yùn)氣不夠技術(shù)湊閱讀 1,106評(píng)論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,105評(píng)論 1 32
  • 面試題參考1 : 面試題[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios閱讀 1,739評(píng)論 0 4
  • 5點(diǎn)的鬧鐘響了,身體有點(diǎn)兒疲憊就這樣順勢(shì)側(cè)臥開(kāi)始冥想,昨日種種看著它流過(guò),清晰透徹起來(lái).那個(gè)一環(huán)扣一環(huán)的線...
    lanfang閱讀 281評(píng)論 0 1
  • 今年是狗年狡忙,正如老話說(shuō)的狗撕羊梳虽,我這只老綿羊愣是沒(méi)過(guò)一天好日子。年初就連續(xù)做了兩個(gè)手術(shù)灾茁,差點(diǎn)血盡窜觉,元?dú)獯髠?..
    戰(zhàn)唯閱讀 504評(píng)論 0 0