GeekBand 第二周

字符串 NSString

OC的字符串具有共享性,和恒定性扮念。

NSString共享機(jī)制

<pre><code>
//其實(shí)這兩個(gè)變量都指向了同一個(gè)地址

NSString *str1 = @"Hello World!";

NSString *str4 = @"Hello World!";
</pre></code>為了避免內(nèi)存浪費(fèi)锤岸,編譯器會(huì)做優(yōu)化踢械,將對(duì)象的指針指向同一個(gè)地方沃暗。但是魁兼,這種情況只會(huì)在字面量初始化時(shí)出現(xiàn)

字符串的初始化:

<pre><code>NSString *str1 =@"Hello World!";//字面量初始化

NSString*str2 = [[NSStringalloc]initWithCString:"Hello
World!" encoding:NSUTF8StringEncoding];

//初始化器初始化

NSString*str3 = [NSStringstringWithCString:"Hello
World!" encoding:NSUTF8StringEncoding];

//工廠初始化

//其中坐搔,工廠初始化方法藏研,
是一個(gè)類方法,通過類方法內(nèi)部返回一個(gè)新的對(duì)象
</pre></code>

字符串基本操作

<pre><code>
[str1 stringByAppendingString: @"Hello World"] //加字符串

[str1 stringByReplacingCharactersInRange: @"Hello World"]//替換字符串

[str1 isEqualToString:str2]// 比較值是否相等

str1 == str2 比較指針是否相等
</pre></code>

<pre><code>
for(int i =0 ;i < [str1 length];i
++){

NSLog(@"%c",[str1 characterAtIndex:i]); //遍歷字符串

}

str1 = str1.uppercaseString;//大寫

str1 = str1.lowercaseString;//小寫

str1 = str1.capitalizedString;//首字母大寫

NSRange range = [str1 rangeOfString:@"Hello"];//查找字符串某處是否包含其它字符,返回location和length概行。

NSLog(@"location: %lu,length:%lu",range.location,range.length);

NSString* substr = [str1 substringFromIndex:6];//從索引6開始取他的子字符串

BOOLyOrN = [str1 hasPrefix:@"Hello"];//判斷是否有這個(gè)字符串前綴

NSString* format=[NSString stringWithFormat:@"[%d,
%d]",100,200];//格式化字符串方法
</pre></code>


NSString恒定機(jī)制

<pre><code>[str1 stringByAppendingString:@" Yes!"];

//偽更改蠢挡,不會(huì)去真正的更改str1所指的堆上的值本身,只會(huì)返回一個(gè)新值凳忙,

str1=[str1 stringByAppendingString:@" Yes!"];

//所以要重新給str1賦值业踏。

</pre></code> 如果在st1的字符串后面再加一點(diǎn)字符串,這個(gè)字符串也不會(huì)更改涧卵,這是字符串的恒定性勤家,無(wú)法改變字符串本身。

還有一個(gè)可變字符串 NSMutableString

NSMutableString具有可變性柳恐,它的值是可以被更改的伐脖,因此它也不具備共享性热幔。

NSMutableString內(nèi)存模型

注意:

它是NSString的子類
所以當(dāng)用NSMutableString定義一個(gè)字符串空間mstr1
我們可以把mstr1賦值給NSString類型的str1讼庇,
因?yàn)?code>mstr1的值是NSMutableString類型绎巨,具有可變性,
所有當(dāng)用appendString去更改mstr1的值時(shí)蠕啄,str1的值也會(huì)跟著改變认烁,
這就違反了NSString的恒定性。
所以針對(duì)這個(gè)就要用拷貝屬性[copy str1]去賦值

<pre><code>
NSMutableString mustr3 =[NSMutableStringstringWithCapacity:100];//手動(dòng)分配空間

[mustr3 appendString:@"Hello Objective"]; //增加字符串內(nèi)容

[mustr3 insertString:@"-C" atIndex:mustr3.length];//在指定位置增加內(nèi)容

[mustr3 setString:@"Hi Objective"];//重新設(shè)置字符串

NSRange replaceRange = NSMakeRange(0, 2);//取指定區(qū)間的字符串

[mustr3 replaceCharactersInRange:replaceRange withString:@"Hello"];//替換字符串

NSRange deleteRange = NSMakeRange(5, 10);//刪除指定區(qū)間的字符串

[mustr3 deleteCharactersInRange:deleteRange];//刪除字符串
</pre></code>

以上這些操作都會(huì)直接改變字符串的值
Sizeof(str1) 指的是指針的大小
Str1.length指的是字符串值的長(zhǎng)度

集合類型

數(shù)組 Array

OC的數(shù)組被定義為一個(gè)class介汹,和C的數(shù)組不同却嗡,
而當(dāng)訪問越界時(shí),會(huì)報(bào)錯(cuò)嘹承。

數(shù)組的初始化有三種方法:

<pre><code>
NSArray *array1=[NSArray arrayWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];

//工廠方法窗价,會(huì)返回一個(gè)新的值

NSArray *array2=[[NSArray alloc] initWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];

//初始化器方法

NSArray *array3=@[@"Shanghai",@"Beijing",@"New York",@"Paris"];

//字面量方法
</pre></code>

在工廠和初始化器最后的nil表示輸入結(jié)束。

array里的元素必須是對(duì)象(NSObject的子類)
如果想在array里放值叹卷,那么必須用NSNumber封裝成類對(duì)象再放入array
NSNumber *numberObject1 =[NSNumber numberWithInteger:number ];

NSInteger是整數(shù)值類型撼港,跟隨CPU架構(gòu)變換長(zhǎng)度

當(dāng)用字面量初始化時(shí)要加@ ,用u結(jié)尾骤竹。
NSNumber *numberObject2=@300u;//使用字面常量初始
<pre><code>
Point point;

point.h=100;

point.v=200;

NSValue *pointObject= [NSValue value:&point withObjCType:@encode(Point)];

//使用NSValue將struct包裝為對(duì)象 再放入數(shù)組
</pre></code>

如果想放空值得話,可以用下面的方法
NSNull *nsnull = [NSNull null];

數(shù)組

因?yàn)槊恳粋€(gè)數(shù)組元素的對(duì)象類型可以不一樣帝牡,所以在取元素的時(shí)候,可能存在類型不安全

數(shù)組具有常量性:
數(shù)組的 長(zhǎng)度元素指針 都不可以被更改(一但這個(gè)數(shù)組初始化完畢后蒙揣,長(zhǎng)度和元素指針全都不可以更改) 但是元素指針?biāo)赶虻膶?duì)象內(nèi)部可以更改

可變數(shù)組 NSMutableArray

NSMutableArray是NSArray的子類
它的初始化方式也和NSArray一樣

因?yàn)槭强勺償?shù)組靶溜,它可以執(zhí)行以下操作

[muArray1 addObject:p5];在數(shù)組結(jié)尾增加一個(gè)元素
[muArray1 removeObjectAtIndex:2];移除指定索引上的元素
[muArray1 insertObject:p6 atIndex:1];在指定索引上插入元素
muArray1[0]=p7;替換指定索引的元素

和可變字符串一樣,可變數(shù)組在初始化后懒震,會(huì)分配一個(gè)緩存容量Capacity罩息,一般大于實(shí)際元素?cái)?shù)量,當(dāng)實(shí)際容量大于Capacity時(shí)个扰,Capacity會(huì)以兩倍的方式增長(zhǎng)瓷炮。
最好的方法是在初始化初期就預(yù)估分配合理的空間給數(shù)組。
intcount=100; NSMutableArray*muArray2=[NSMutableArrayarrayWithCapacity:count];

在實(shí)際操作過程中递宅,盡量避免使用removeObjectAtIndex:insertObject: atIndex:
因?yàn)闀?huì)改變數(shù)組序列娘香,涉及大量的內(nèi)存拷貝操作,代價(jià)太大办龄。

數(shù)組的遍歷

<pre><code>
for( BLNPoint* point inarray5)

{

point.x++;

point.y++;

}

//快速遍歷法 for-in 所有遍歷方法中烘绽,速度最快,因?yàn)樗苯釉L問內(nèi)存土榴,優(yōu)化了索引檢查诀姚。
</pre></code>如果不知道數(shù)組元素的類型的話,要寫成id*point或者NSObject* point

<pre><code>NSEnumerator *enumerator = [array5 objectEnumerator];

BLNPoint* item;

while(item = [enumerator nextObject])

{

item.x++;

item.y++;

}

//迭代枚舉法玷禽,相比于for-in會(huì)慢一點(diǎn)
</pre></code>array5 上面會(huì)有一個(gè) objectEnumerator 方法得到一個(gè)NSEnumerator對(duì)象類型赫段,那這個(gè)對(duì)象類型去調(diào)用 nextObject 方法 呀打,再把返回的值賦給 用NSEnumerator 創(chuàng)建的對(duì)象 item,當(dāng)沒有元素的時(shí)候糯笙,他的值就是nil贬丛,也就不會(huì)再繼續(xù)while循環(huán)。

<pre><code>for(inti=0; i<array5.count; i++)

{

NSLog(@"array5[%d],%@",i,array5[i]);

}

for循環(huán)遍歷给涕,最慢的方法豺憔。
</pre></code>

所有遍歷方法中,推薦使用for-in够庙。

數(shù)組查找:
<pre><code>BLNPoint* target=[[BLNPointalloc] initWithX:33WithY:63];

NSUIntegerindex1=[array5 indexOfObject:target];

// 在 array5 中查找是否有和 tearget 值相同的元素恭应,并且返回索引

NSUIntegerindex2=[array5 indexOfObjectIdenticalTo:p3];

// 這個(gè)方法只能用數(shù)組內(nèi)的元素名查找,并返回索引

NSLog(@"find at%lu", index1);

NSLog(@"find at
%lu", index2);
</pre></code>

數(shù)組排序:

<pre><code>NSArray* sortArray1=[array1 sortedArrayUsingSelector:@selector(compare:)];</pre></code>我們指定了一個(gè)方法 compare: 它可以實(shí)現(xiàn)數(shù)組里元素的比較
因?yàn)闊o(wú)法改變?cè)瓟?shù)組耘眨,所以要取它的返回值給 sortArray1
它是通過返回一個(gè)新數(shù)組來表達(dá)排序的結(jié)果

set集合

NSSet和數(shù)組不一樣昼榛,是一個(gè)無(wú)序集合,存儲(chǔ)的對(duì)象不能重復(fù)
被定義為class 剔难,引用類型胆屿,拷貝時(shí)有引用語(yǔ)句
有常量集合NSSet,可變集合NSMutableSet偶宫,和數(shù)組一樣非迹。

初始化方式也和數(shù)組類似
<pre><code>NSSet*set1 =

[NSSetsetWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];

NSMutableSet*set2 =

[NSMutableSetsetWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];

</pre></code>
Capacity set容量??
<pre><code>int count=100;

NSMutableSet*muArray2=[NSMutableSetinitWithCapacity:count];
</pre></code>

set的一下操作
<pre><code>
[set2 addObject:@"London"];//加元素

[set2 removeObject:@"Beijing"];//移除元素

NSLog(@"set2 count:%lu", set2.count);

</pre></code>

<pre><code>
if([set2 containsObject:@"Shanghai"])//判斷是否包含某個(gè)對(duì)象
</pre></code>

字典

Dictionary 字典 是一個(gè)存儲(chǔ)Key-Value的無(wú)序集合
Key唯一,value可重復(fù)
Array 纯趋、Set 一樣憎兽,
有常量字典NSDictionary 和可變字典NSMutableDictionary

初始化方式也和數(shù)組差不多

字面常量初始化:
valueKey之前结闸,中間用:隔開<pre><code>
NSDictionary *dictionary1 = @{

                            @"Shanghai": p1,             
                            @"Beijing": p2,               
                            @"NewYork" : p3,         
                            @"Paris": p4 };

</pre></code>

工廠方法:
Valuekey之后唇兑,中間用" ,"隔開
<pre><code>
NSMutableDictionary*dictionary2 =

[NSMutableDictionarydictionaryWithObjectsAndKeys:

                             p1,@"Shanghai",             
                             p2,@"Beijing",   
                             p3,@"New York",
                             p4,@"Paris",
                             nil];

</pre></code>

<pre><code>
BLNPoint* result1=[dictionary1 objectForKey:@"Beijing"];

BLNPoint* result2=dictionary1[@"Shanghai"];
</pre></code>可以用這種方式查詢Key來得到對(duì)應(yīng)的value

** tip **:所有的可變集合都是其對(duì)應(yīng)的一個(gè)常量集合的子類桦锄。

自動(dòng)引用計(jì)數(shù)ARC

ARC 是OC的默認(rèn)內(nèi)存管理機(jī)制,針對(duì)堆上的對(duì)象蔫耽,由編譯器自動(dòng)生成操作ARC指令(retinarelease)來管理對(duì)象的創(chuàng)建和釋放结耀。
retinarelease在后期的高級(jí)編程內(nèi)容里會(huì)深入了解

受ARC管理的有:

  • OC的對(duì)象指針
  • Block 指針
  • Attribute((NSObject))定義的typedef

不受ARC管理的有:

  • 值類型(如C語(yǔ)言的結(jié)構(gòu))
  • 使用其他方式分配的堆對(duì)象(如malloc)
  • 非內(nèi)存資源

實(shí)際上,指針本身不受ARC管理匙铡,因?yàn)锳RC管理的是堆上的對(duì)象图甜,而指針是存放在棧上的。所有ARC管理的實(shí)際上是指針?biāo)赶虻哪莻€(gè)對(duì)象鳖眼。
而值類型的對(duì)象也是存放在棧上黑毅,所以也不受ARC管理。

引用計(jì)數(shù)管理

引用計(jì)數(shù)+1的操作 (retain操作)
當(dāng)將對(duì)象執(zhí)行對(duì)其他對(duì)象的

  • 賦值
  • 傳參
  • 加入集合操作

引用計(jì)數(shù)-1 (release操作)

  • 全局(局部)變量被賦值為nil 或其他值
  • 屬性被賦值為nil或其他值
  • 將對(duì)象從集合中刪除
引用計(jì)數(shù)

自動(dòng)釋放池 AutoRelease Pool

release 會(huì)導(dǎo)致對(duì)象立即釋放钦讳,如果頻繁的release矿瘦,會(huì)造成瑣碎的內(nèi)存管理負(fù)擔(dān)枕面。這時(shí)候,用autorelease可以將release的調(diào)用推遲到autorelease被釋放時(shí)缚去。

AppkitUIkit框架在每一次事件迭代時(shí)潮秘,都會(huì)將這個(gè)代碼放入autoreleasepool中。大多數(shù)情況都不需要人為干預(yù)易结。

main函數(shù)內(nèi)枕荞,編譯器都會(huì)在開始加上一個(gè)autorelease的塊當(dāng)程序運(yùn)行到autorelease結(jié)束時(shí),所有引用了release的對(duì)象都會(huì)被立即釋放

<pre><code>
int main(int argc, const char * argv[]) {

                 @autoreleasepool{ 
                           NSLog(@"-------ARC Demo: ----------");
                           arcDemo();
                   //當(dāng)函數(shù)內(nèi)執(zhí)行完后搞动,會(huì)引用release躏精,然后這個(gè)釋放信號(hào)會(huì)暫存在autorelease內(nèi)   
                           NSLog(@"-------Autorelease Pool Demo: ----------");    
                           poolDemo();
                  }
                   //當(dāng)這個(gè)autorelease執(zhí)行完后,就會(huì)被釋放鹦肿,隨之存在其中的release也會(huì)被立即釋放矗烛。
      return0;

}
</pre></code>每一個(gè)事件處理,都是一個(gè)autoreleasepool的建立和釋放

需要手工管理autorelease pool的情況

  1. 編寫的程序不基于UI框架(如命令行程序)
  • 在循環(huán)中創(chuàng)建了大量臨時(shí)變量狮惜,需要提早釋放高诺,避免臨時(shí)對(duì)象聚集而導(dǎo)致內(nèi)存峰值過高。
  • 在主線程之外創(chuàng)建了新的線程碾篡,需要自己手工添加autorelease pool 塊
  • 可以嵌套使用

<pre><code>
void poolDemo(){

@autoreleasepool{  
        for (int i = 0; i < 10; i++) {
              __unused  BLNRectangle *rect = [[BLNRectangle alloc]init];
        }
     }

}
</pre></code>

__unused 修飾符虱而,通知編譯器,如果這個(gè)變量未被使用就不參與編譯(消除黃色警告團(tuán))

協(xié)議protocol

協(xié)議是一種約定开泽,它只提供外部描述牡拇,不提供具體實(shí)現(xiàn),所以只在.h文件內(nèi)寫穆律,不用去寫.m文件

協(xié)議里可以放

  1. 屬性
  • 實(shí)例方法
  • 類方法
  • 初始化器和析構(gòu)器(一般不放)

但是不能放實(shí)例變量惠呼。編譯器會(huì)自動(dòng)生成setter和getter方法,但是不會(huì)合成實(shí)例變量峦耘。

定義協(xié)議

<pre><code>@protocol Drawable

//內(nèi)容

@end
</pre></code>

使用協(xié)議

<pre><code>
@interface BLNPoint : NSObject<Drawable>//把協(xié)議名放中括號(hào)里

//內(nèi)容

@end
</pre></code>

** 必選協(xié)議required **
** 可選協(xié)議optional **

協(xié)議里的成員默認(rèn)都是@required的剔蹋,當(dāng)一個(gè)類遵守協(xié)議時(shí),必須要實(shí)現(xiàn)協(xié)議內(nèi)的所有成員辅髓。.h文件里不用去再次聲明協(xié)議內(nèi)的方法泣崩,只需要在.m文件內(nèi)實(shí)現(xiàn)就可以了。
** 但是屬性必須再次聲明 **洛口。如果不聲明的話矫付,就沒法自動(dòng)合成實(shí)例變量。
如果要自己寫一個(gè)@required的話第焰,那個(gè)在這個(gè)@required后面的成員就是必選成員了
與之相對(duì)的@optional表示的是可選協(xié)議买优。他之后的成員會(huì)被認(rèn)為成可選協(xié)議

如果遵守協(xié)議但是沒有去實(shí)現(xiàn)協(xié)議方法,會(huì)出現(xiàn)警告運(yùn)行時(shí)就會(huì)報(bào)錯(cuò)。
協(xié)議類型變量被賦值非協(xié)議類型對(duì)象時(shí)杀赢,會(huì)出現(xiàn)警告
比如這樣賦值就會(huì)報(bào)錯(cuò)process1(@"x");烘跺,process1是協(xié)議類型的函數(shù)

協(xié)議可以作為變量聲明類型,但是不能創(chuàng)建實(shí)例void process1(id<Drawable> obj)

有時(shí)不確定這個(gè)對(duì)象是否遵守了協(xié)議葵陵,那么可以用這段代碼來驗(yàn)證這個(gè)對(duì)象背后的類型是否遵守了協(xié)議液荸。
<pre><code>
void process2(id obj){

        if([obj conformsToProtocol:@protocol(AProtocol) ]) {
        [obj methodA]; 

}
</pre></code>

一個(gè)協(xié)議也可以繼承多個(gè)協(xié)議。

實(shí)現(xiàn)子協(xié)議的類型脱篙,也必須實(shí)現(xiàn)父類協(xié)議的成員娇钱。

繼承協(xié)議

也可以遵守多個(gè)協(xié)議
<pre><code>
@interface ClassC : NSObject<AProtocol,CProtocol>

@end
</pre></code>

常用的協(xié)議

NSObject:包含對(duì)象的常用操作,相等绊困、字符串表示文搂、哈希。
NSCopying:支持復(fù)制的類型必須遵守該協(xié)議秤朗。
NSMutableCopying:在NSCopying的基礎(chǔ)上煤蹭,支持復(fù)制數(shù)據(jù)的可變性。
NSFastEnumeration:實(shí)現(xiàn)快速美劇for-in的類型采用該協(xié)議取视。
NSCoding:支持將對(duì)象圖進(jìn)行編碼/解碼以支持對(duì)象序列化

類別與擴(kuò)展

類別category

類別就不知道源代碼的情況下硝皂,想給原有的類再添加了一些成員,并去實(shí)現(xiàn)他們

定義類

@interface BLNPoint : NSObject

定義類別

@interface BLNPoint(Drawing)

** tip **:category的實(shí)現(xiàn)文件不寫在class的實(shí)現(xiàn)文件內(nèi),而是寫在category的實(shí)現(xiàn)文件內(nèi)

命名規(guī)范:

文件名 == class名+category

category可以添加的成員

  1. 類方法
  • 實(shí)例方法
  • 重寫基類方法

category不能添加的成員

  1. 屬性
  2. 實(shí)例變量
  3. 已存在的同名方法(已經(jīng)被定義過的)

加了屬性的話作谭,編譯能通過稽物,但是在運(yùn)行的時(shí)候就會(huì)報(bào)錯(cuò)(坑爹啊這是)
不能加屬性,實(shí)際上是因?yàn)椴荒芗訉傩员澈蟮哪莻€(gè)實(shí)例變量折欠。
雖然不能加屬性贝或,但是可以去定義一個(gè)setter和一個(gè)getter訪問器方法。
-(void)setWeight:(NSInteger)weight;
-(NSInteger)weight;
調(diào)用class內(nèi)的實(shí)例變量

適用場(chǎng)景:
  1. 在沒有源代碼的情況下锐秦,向已經(jīng)封裝的類里添加方法
  2. 在一些特殊場(chǎng)合下
  • 對(duì)復(fù)雜的大型文件分割實(shí)現(xiàn)

都一下位置可以添加category

  • 自己創(chuàng)建的
  • 系統(tǒng)的
  • 第三方庫(kù)

擴(kuò)展extension

category最大的區(qū)別在于苍凛,這是在有class的源代碼的情況下在class內(nèi)添加固翰,可以看做是一個(gè)沒有名字的class,不用定義在 .h文件鹉动,直接在需要擴(kuò)展的.m文件內(nèi)定義.
<pre><code>
@interface Circle ()//加個(gè)小括號(hào)笙瑟,寫在.m 文件里

{

NSString* _name;

}

@property (readwrite )NSInteger radius;//修改讀寫屬性

@property
NSIntegercenter;//添加屬性

-(float)getDiameter;//實(shí)例方法

+(void)process:(Circle*) circle;//類方法

@end
</pre></code>
如果在主接口定義了文件的讀寫屬性客税,那么在擴(kuò)展內(nèi)可以更改讀寫屬性赫蛇,
有一點(diǎn)需要注意的是阿纤,只能往更高的權(quán)限更高,** 不能把權(quán)限改低揍堕。 **

注意:

最重要的一點(diǎn)區(qū)別,擴(kuò)展的成員只針對(duì)類(那個(gè) .m文件)內(nèi)可以訪問汤纸,在類外不能訪問擴(kuò)展衩茸!

擴(kuò)展的主要用途就是信息隱藏,可以把一些外部無(wú)需訪問贮泞,但是類內(nèi)又要用到的成員私有化楞慈。

類的主接口用于 ** 對(duì)外公開訪問 **
類的擴(kuò)展用于 ** 對(duì)內(nèi)訪問 **

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幔烛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囊蓝,更是在濱河造成了極大的恐慌饿悬,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚霜,死亡現(xiàn)場(chǎng)離奇詭異狡恬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝎宇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門弟劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姥芥,你說我怎么就攤上這事兔乞。” “怎么了凉唐?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵庸追,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我台囱,道長(zhǎng)淡溯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任玄坦,我火速辦了婚禮血筑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煎楣。我一直安慰自己豺总,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布择懂。 她就那樣靜靜地躺著喻喳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪困曙。 梳的紋絲不亂的頭發(fā)上表伦,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音慷丽,去河邊找鬼蹦哼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛要糊,可吹牛的內(nèi)容都是我干的纲熏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼局劲!你這毒婦竟也來了勺拣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鱼填,失蹤者是張志新(化名)和其女友劉穎药有,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苹丸,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愤惰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谈跛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊苟。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖感憾,靈堂內(nèi)的尸體忽然破棺而出蜡励,到底是詐尸還是另有隱情,我是刑警寧澤阻桅,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布凉倚,位于F島的核電站,受9級(jí)特大地震影響嫂沉,放射性物質(zhì)發(fā)生泄漏稽寒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一趟章、第九天 我趴在偏房一處隱蔽的房頂上張望杏糙。 院中可真熱鬧,春花似錦蚓土、人聲如沸宏侍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谅河。三九已至,卻和暖如春确丢,著一層夾襖步出監(jiān)牢的瞬間绷耍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工鲜侥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褂始,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓描函,卻偏偏與公主長(zhǎng)得像病袄,于是被迫代替她去往敵國(guó)和親搂赋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • @字符串處理 NSString是一個(gè)Unicode編碼益缠,16位的字符序列,是類基公,引用類型幅慌。 初始化方法有字面常量初...
    5君閱讀 704評(píng)論 0 51
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評(píng)論 30 470
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí)轰豆,該對(duì)象的保留計(jì)數(shù)器值為1...
    如風(fēng)家的秘密閱讀 843評(píng)論 0 4
  • 多線程胰伍、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景酸休。SDWebImage的原...
    LZM輪回閱讀 2,007評(píng)論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,980評(píng)論 0 7