__attribute__ 總結(jié)

attribute是GNU C特色之一,在iOS用的比較廣泛.系統(tǒng)中有許多地方使用到. attribute可以設(shè)置函數(shù)屬性(Function Attribute )褂策、變量屬性(Variable Attribute )和類型屬性(Type Attribute)等.

函數(shù)屬性(Function Attribute)

  • noreturn
  • noinline
  • always_inline
  • pure
  • const
  • nothrow
  • sentinel
  • format
  • format_arg
  • no_instrument_function
  • section
  • constructor
  • destructor
  • used
  • unused
  • deprecated
  • weak
  • malloc
  • alias
  • warn_unused_result
  • nonnull

類型屬性(Type Attributes)

  • aligned
  • packed
  • transparent_union,
  • unused,
  • deprecated
  • may_alias

變量屬性(Variable Attribute)

  • aligned
  • packed

Clang特有的

  • availability
  • overloadable

書(shū)寫(xiě)格式

書(shū)寫(xiě)格式:attribute后面會(huì)緊跟一對(duì)原括弧匹厘,括弧里面是相應(yīng)的attribute參數(shù)

__attribute__(xxx)

常見(jiàn)的系統(tǒng)用法

format

官方例子:NSLog

 #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))

format屬性可以給被聲明的函數(shù)加上類似printf或者scanf的特征,它可以使編譯器檢查函數(shù)聲明和函數(shù)實(shí)際調(diào)用參數(shù)之間的格式化字符串是否匹配耻讽。該功能十分有用越平,尤其是處理一些很難發(fā)現(xiàn)的bug匈庭。對(duì)于format參數(shù)的使用如下
format (archetype, string-index, first-to-check)
第一參數(shù)需要傳遞“archetype”指定是哪種風(fēng)格,這里是 NSString;“string-index”指定傳入函數(shù)的第幾個(gè)參數(shù)是格式化字符串甜攀;“first-to-check”指定第一個(gè)可變參數(shù)所在的索引.

noreturn

官方例子: abort() 和 exit()

該屬性通知編譯器函數(shù)從不返回值秋泄。當(dāng)遇到類似函數(shù)還未運(yùn)行到return語(yǔ)句就需要退出來(lái)的情況,該屬性可以避免出現(xiàn)錯(cuò)誤信息规阀。

availability

官方例子:

- (CGSize)sizeWithFont:(UIFont *)font NS_DEPRECATED_IOS(2_0, 7_0, "Use -sizeWithAttributes:") __TVOS_PROHIBITED;

//來(lái)看一下 后邊的宏
 #define NS_DEPRECATED_IOS(_iosIntro, _iosDep, ...) CF_DEPRECATED_IOS(_iosIntro, _iosDep, __VA_ARGS__)

define CF_DEPRECATED_IOS(_iosIntro, _iosDep, ...) __attribute__((availability(ios,introduced=_iosIntro,deprecated=_iosDep,message="" __VA_ARGS__)))

//宏展開(kāi)以后如下
__attribute__((availability(ios,introduced=2_0,deprecated=7_0,message=""__VA_ARGS__)));
//ios即是iOS平臺(tái)
//introduced 從哪個(gè)版本開(kāi)始使用
//deprecated 從哪個(gè)版本開(kāi)始棄用
//message    警告的消息

availability屬性是一個(gè)以逗號(hào)為分隔的參數(shù)列表恒序,以平臺(tái)的名稱開(kāi)始,包含一些放在附加信息里的一些里程碑式的聲明谁撼。

  • introduced:第一次出現(xiàn)的版本歧胁。

  • deprecated:聲明要廢棄的版本,意味著用戶要遷移為其他API

  • obsoleted: 聲明移除的版本厉碟,意味著完全移除喊巍,再也不能使用它

  • unavailable:在這些平臺(tái)不可用

  • message:一些關(guān)于廢棄和移除的額外信息,clang發(fā)出警告的時(shí)候會(huì)提供這些信息箍鼓,對(duì)用戶使用替代的API非常有用崭参。

  • 這個(gè)屬性支持的平臺(tái):ios,macosx款咖。

簡(jiǎn)單例子:

//如果經(jīng)常用,建議定義成類似系統(tǒng)的宏
- (void)oldMethod:(NSString *)string __attribute__((availability(ios,introduced=2_0,deprecated=7_0,message="用 -newMethod: 這個(gè)方法替代 "))){
    NSLog(@"我是舊方法,不要調(diào)我");
}

- (void)newMethod:(NSString *)string{
    NSLog(@"我是新方法");
}

效果:


Paste_Image.png

//如果調(diào)用了,會(huì)有警告


Paste_Image.png

unavailable

告訴編譯器該方法不可用何暮,如果強(qiáng)行調(diào)用編譯器會(huì)提示錯(cuò)誤。比如某個(gè)類在構(gòu)造的時(shí)候不想直接通過(guò)init來(lái)初始化之剧,只能通過(guò)特定的初始化方法()比如單例郭卫,就可以將init方法標(biāo)記為unavailable;

//系統(tǒng)的宏,可以直接拿來(lái)用
 #define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable))

 #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE

@interface Person : NSObject

@property(nonatomic,copy) NSString *name;

@property(nonatomic,assign) NSUInteger age;

- (instancetype)init NS_UNAVAILABLE;

- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age;

@end

Paste_Image.png

//實(shí)際上unavailable后面可以跟參數(shù),顯示一些信息,如:

//系統(tǒng)的
 #define NS_AUTOMATED_REFCOUNT_UNAVAILABLE __attribute__((unavailable("not available in automatic reference counting mode")))

objc_root_class

表示這個(gè)類是一個(gè)根類(基類),比如NSObject,NSProxy.

//摘自系統(tǒng)
//NSProxy
NS_ROOT_CLASS
@interface NSProxy <NSObject> {
    Class   isa;
}

//NSObject
__OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0)
OBJC_ROOT_CLASS
OBJC_EXPORT
@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}

NSObject

@property (nonatomic,strong) __attribute__((NSObject)) CFDictionaryRef myDictionary;

CFDictionaryRef屬于CoreFoundation框架的,也就是非OC對(duì)象,加上attribute((NSObject))后,myDictionary的內(nèi)存管理會(huì)被當(dāng)做OC對(duì)象來(lái)對(duì)待.

objc_designated_initializer

用來(lái)修飾類的designated initializer初始化方法,如果修飾的方法里沒(méi)有調(diào)用super類的 designated initializer背稼,編譯器會(huì)發(fā)出警告〔r颍可以簡(jiǎn)寫(xiě)成NS_DESIGNATED_INITIALIZER

這篇文章講的很好,建議參考這個(gè).
https://yq.aliyun.com/articles/5847

visibility

語(yǔ)法:

__attribute__((visibility("visibility_type")))

其中蟹肘,visibility_type 是下列值之一:

  • default
    假定的符號(hào)可見(jiàn)性可通過(guò)其他選項(xiàng)進(jìn)行更改。缺省可見(jiàn)性將覆蓋此類更改俯树。缺省可見(jiàn)性與外部鏈接對(duì)應(yīng)帘腹。

  • hidden
    該符號(hào)不存放在動(dòng)態(tài)符號(hào)表中,因此许饿,其他可執(zhí)行文件或共享庫(kù)都無(wú)法直接引用它阳欲。使用函數(shù)指針可進(jìn)行間接引用。

  • internal
    除非由 特定于處理器的應(yīng)用二進(jìn)制接口 (psABI) 指定,否則球化,內(nèi)部可見(jiàn)性意味著不允許從另一模塊調(diào)用該函數(shù)秽晚。

  • protected
    該符號(hào)存放在動(dòng)態(tài)符號(hào)表中,但定義模塊內(nèi)的引用將與局部符號(hào)綁定筒愚。也就是說(shuō)赴蝇,另一模塊無(wú)法覆蓋該符號(hào)。

  • 除指定 default 可見(jiàn)性外巢掺,此屬性都可與在這些情況下具有外部鏈接的聲明結(jié)合使用句伶。
    您可在 C 和 C++ 中使用此屬性。在 C++ 中陆淀,還可將它應(yīng)用于類型考余、成員函數(shù)和命名空間聲明。

系統(tǒng)用法:

//  UIKIT_EXTERN     extern
 #ifdef __cplusplus
 #define UIKIT_EXTERN        extern "C" __attribute__((visibility ("default")))
 #else
 #define UIKIT_EXTERN            extern __attribute__((visibility ("default")))
 #endif

nonnull

編譯器對(duì)函數(shù)參數(shù)進(jìn)行NULL的檢查,參數(shù)類型必須是指針類型(包括對(duì)象)
//使用

- (int)addNum1:(int *)num1 num2:(int *)num2  __attribute__((nonnull (1,2))){//1,2表示第一個(gè)和第二個(gè)參數(shù)不能為空
    return  *num1 + *num2;
}

- (NSString *)getHost:(NSURL *)url __attribute__((nonnull (1))){//第一個(gè)參數(shù)不能為空
    return url.host;
}

常見(jiàn)用法

aligned

__attribute((aligned (n)))轧苫,讓所作用的結(jié)構(gòu)成員對(duì)齊在n字節(jié)自然邊界上楚堤。如果結(jié)構(gòu)中有成員的長(zhǎng)度大于n,則按照最大成員的長(zhǎng)度來(lái)對(duì)齊.例如:

不加修飾的情況

typedef struct
{
    char  member1;
    int   member2;
    short member3;
}Family;

//輸出字節(jié):
NSLog(@"Family size is %zd",sizeof(Family));
//輸出結(jié)果為:
2016-07-25 10:28:45.380 Study[917:436064] Family size is 12

//修改字節(jié)對(duì)齊為1

typedef struct
{
    char  member1;
    int   member2;
    short member3;
}__attribute__ ((aligned (1))) Family;

//輸出字節(jié):
NSLog(@"Family size is %zd",sizeof(Family));
//輸出結(jié)果為:
2016-07-25 10:28:05.315 Study[914:435764] Family size is 12

和上面的結(jié)果一致,因?yàn)?設(shè)定的字節(jié)對(duì)齊為1.而結(jié)構(gòu)體中成員的最大字節(jié)數(shù)是int 4個(gè)字節(jié),1 < 4,按照4字節(jié)對(duì)齊,和系統(tǒng)默認(rèn)一致.

修改字節(jié)對(duì)齊為8

typedef struct
{
    char  member1;
    int   member2;
    short member3;
}__attribute__ ((aligned (8))) Family;

//輸出字節(jié):
NSLog(@"Family size is %zd",sizeof(Family));
//輸出結(jié)果為:
2016-07-25 10:28:05.315 Study[914:435764] Family size is 16

這里 8 > 4,按照8字節(jié)對(duì)齊,結(jié)果為16,不知道字節(jié)對(duì)齊的可以看我的這篇文章http://www.reibang.com/p/f69652c7df99

可是想了半天,也不知道這玩意有什么用,設(shè)定值小于系統(tǒng)默認(rèn)的,和沒(méi)設(shè)定一樣,設(shè)定大了,又浪費(fèi)空間,效率也沒(méi)提高,感覺(jué)學(xué)習(xí)學(xué)習(xí)就好.

packed

讓指定的結(jié)構(gòu)結(jié)構(gòu)體按照一字節(jié)對(duì)齊,測(cè)試:

//不加packed修飾
typedef struct {
    char    version;
    int16_t sid;
    int32_t len;
    int64_t time;
} Header;

//計(jì)算長(zhǎng)度
NSLog(@"size is %zd",sizeof(Header));
輸出結(jié)果為:
2016-07-22 11:53:47.728 Study[14378:5523450] size is 16

可以看出,默認(rèn)系統(tǒng)是按照4字節(jié)對(duì)齊

//加packed修飾
typedef struct {
    char    version;
    int16_t sid;
    int32_t len;
    int64_t time;
}__attribute__ ((packed)) Header;

//計(jì)算長(zhǎng)度
NSLog(@"size is %zd",sizeof(Header));
輸出結(jié)果為:
2016-07-22 11:57:46.970 Study[14382:5524502] size is 15

用packed修飾后,變?yōu)?字節(jié)對(duì)齊,這個(gè)常用于與協(xié)議有關(guān)的網(wǎng)絡(luò)傳輸中.

noinline & always_inline

內(nèi)聯(lián)函數(shù):內(nèi)聯(lián)函數(shù)從源代碼層看浸剩,有函數(shù)的結(jié)構(gòu)钾军,而在編譯后,卻不具備函數(shù)的性質(zhì)绢要。內(nèi)聯(lián)函數(shù)不是在調(diào)用時(shí)發(fā)生控制轉(zhuǎn)移吏恭,而是在編譯時(shí)將函數(shù)體嵌入在每一個(gè)調(diào)用處。編譯時(shí)重罪,類似宏替換樱哼,使用函數(shù)體替換調(diào)用處的函數(shù)名。一般在代碼中用inline修飾剿配,但是能否形成內(nèi)聯(lián)函數(shù)搅幅,需要看編譯器對(duì)該函數(shù)定義的具體處理

  • noinline 不內(nèi)聯(lián)
  • always_inline 總是內(nèi)聯(lián)
  • 這兩個(gè)都是用在函數(shù)上

內(nèi)聯(lián)的本質(zhì)是用代碼塊直接替換掉函數(shù)調(diào)用處,好處是:快代碼的執(zhí)行,減少系統(tǒng)開(kāi)銷.適用場(chǎng)景:

  • 這個(gè)函數(shù)更小
  • 這個(gè)函數(shù)不被經(jīng)常調(diào)用

使用例子:

//函數(shù)聲明
void test(int a) __attribute__((always_inline));

warn_unused_result

當(dāng)函數(shù)或者方法的返回值很重要時(shí),要求調(diào)用者必須檢查或者使用返回值,否則編譯器會(huì)發(fā)出警告提示

- (BOOL)availiable __attribute__((warn_unused_result))
{
   return 10;
}

警告如下:

Paste_Image.png

objc_subclassing_restricted

因?yàn)槟承┰?我們不希望這個(gè)類被繼承,也就是 "最終"的類,用法如下:

__attribute__((objc_subclassing_restricted))
@interface ViewController : UIViewController


@end

如果繼承了這個(gè)類,編譯器會(huì)報(bào)錯(cuò)

Paste_Image.png

objc_requires_super

這個(gè)屬性要求子類在重寫(xiě)父類的方法時(shí),必須要重載父類方法,也就是調(diào)用super方法,否則警告.示例如下:

@interface ViewController : UIViewController

- (void)jump __attribute__((objc_requires_super));

@end

- (void)jump{
    NSLog(@"父類必須先執(zhí)行");
}


@interface SGViewController : ViewController

@end

@implementation SGViewController
- (void)jump{
    NSLog(@"子類才能再執(zhí)行");
}
@end

警告如下:

Paste_Image.png

objc_boxable

實(shí)現(xiàn)類似于NSNumber 的快速打包能力@(...),一般對(duì)于struct,union我們只能通過(guò)NSValue將其打包. objc_boxable 可以幫助我們實(shí)現(xiàn)快速打包,示例如下:

//自定義結(jié)構(gòu)體
typedef struct __attribute__((objc_boxable)){
    CGFloat x,y,width,height;
}SGRect;

 SGRect rect = {0,0,100,200};
 //這里直接打包成NSValue
 NSValue *value = @(rect);
 
 //這里我直接用系統(tǒng)的方法打印
 NSLog(@"%@",NSStringFromCGRect(value.CGRectValue));
 
 輸出:
 2016-07-21 21:28:43.538 Study[14118:5408921] {{0, 0}, {100, 200}}

這樣SGRect就具備快速打包功能了.

constructor / destructor

意思是: 構(gòu)造器和析構(gòu)器;constructor修飾的函數(shù)會(huì)在main函數(shù)之前執(zhí)行,destructor修飾的函數(shù)會(huì)在程序exit前調(diào)用.
示例如下:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        NSLog(@"main");
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

__attribute__((constructor))
void  before(){
    NSLog(@"before main");
}

__attribute__((destructor))
void  after(){
    NSLog(@"after main");
}

//在viewController中調(diào)用exit
- (void)viewDidLoad {
    [super viewDidLoad];
    
    exit(0);
}
輸出如下:

2016-07-21 21:49:17.446 Study[14162:5415982] before main
2016-07-21 21:49:17.447 Study[14162:5415982] main
2016-07-21 21:49:17.534 Study[14162:5415982] after main

注意點(diǎn):

  • 程序退出的時(shí)候才會(huì)調(diào)用after函數(shù),經(jīng)測(cè)試,手動(dòng)退出程序會(huì)執(zhí)行
  • 上面兩個(gè)函數(shù)不管寫(xiě)在哪個(gè)類里,哪個(gè)文件中效果都一樣
  • 如果存在多個(gè)修飾的函數(shù),那么都會(huì)執(zhí)行,順序不定

實(shí)際上如果存在多個(gè)修飾過(guò)的函數(shù),可以它們的調(diào)整優(yōu)先級(jí)
代碼如下:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        NSLog(@"main");
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

__attribute__((constructor(101)))
void  before1(){
    NSLog(@"before main - 1");
}
__attribute__((constructor(102)))
void  before2(){
    NSLog(@"before main - 2");
}

__attribute__((destructor(201)))
void  after1(){
    NSLog(@"after main - 1");
}
__attribute__((destructor(202)))
void  after2(){
    NSLog(@"after main - 2");
}

輸出結(jié)果如下:
2016-07-21 21:59:35.622 Study[14171:5418393] before main - 1
2016-07-21 21:59:35.624 Study[14171:5418393] before main - 2
2016-07-21 21:59:35.624 Study[14171:5418393] main
2016-07-21 21:59:35.704 Study[14171:5418393] after main - 2
2016-07-21 21:59:35.704 Study[14171:5418393] after main - 1

注意點(diǎn):

  • 括號(hào)內(nèi)的值表示優(yōu)先級(jí),[0,100]這個(gè)返回時(shí)系統(tǒng)保留的,自己千萬(wàn)別調(diào)用.
  • 根據(jù)輸出結(jié)果可以看出,main函數(shù)之前的,數(shù)值越小,越先調(diào)用;main函數(shù)之后的數(shù)值越大,越先調(diào)用.

當(dāng)函數(shù)聲明和函數(shù)實(shí)現(xiàn)分開(kāi)寫(xiě)時(shí),格式如下:

static void before() __attribute__((constructor));

static void before() {
    printf("before\n");
}

討論:+load,constructor,main的執(zhí)行順序,代碼如下:


+ (void)load{
    NSLog(@"load");
}
__attribute__((constructor))
void  before(){
    NSLog(@"before main");
}

輸出結(jié)果如下:
2016-07-21 22:13:58.591 Study[14185:5421811] load
2016-07-21 22:13:58.592 Study[14185:5421811] before main
2016-07-21 22:13:58.592 Study[14185:5421811] main

可以看出執(zhí)行順序?yàn)?
load->constructor->main
為什么呢?
因?yàn)?dyld(動(dòng)態(tài)鏈接器呼胚,程序的最初起點(diǎn))在加載 image(可以理解成 Mach-O 文件)時(shí)會(huì)先通知 objc runtime 去加載其中所有的類茄唐,每加載一個(gè)類時(shí),它的 +load 隨之調(diào)用蝇更,全部加載完成后沪编,dyld 才會(huì)調(diào)用這個(gè) image 中所有的 constructor 方法,然后才調(diào)用main函數(shù).

enable_if

用來(lái)檢查參數(shù)是否合法,只能用來(lái)修飾函數(shù):

void printAge(int age)
__attribute__((enable_if(age > 0  && age < 120, "你丫太監(jiān)?")))
{
    NSLog(@"%d",age);
}

表示只能輸入的參數(shù)只能是 0 ~ 120左右,否則編譯報(bào)錯(cuò)
報(bào)錯(cuò)如下:

Paste_Image.png

cleanup

聲明到一個(gè)變量上,當(dāng)這個(gè)變量作用域結(jié)束時(shí)年扩,調(diào)用指定的一個(gè)函數(shù).如果不知道什么是作用域,請(qǐng)先學(xué)習(xí)一下.例子:

//這里傳遞的參數(shù)是變量的地址
void intCleanup(int *num){
    NSLog(@"cleanup------%d",*num);
}

- (void)test{
  int a __attribute__((cleanup(intCleanup))) = 10;
}

輸出結(jié)果為:
2016-07-22 09:59:09.139 Study[14293:5495713] cleanup------10

注意點(diǎn):

  • 指定的函數(shù)傳遞的參數(shù)是變量的地址
  • 作用域的結(jié)束包括:大括號(hào)結(jié)束蚁廓、return、goto厨幻、break相嵌、exception等情況
  • 當(dāng)作用域內(nèi)有多個(gè)cleanup的變量時(shí),遵守 先入后出 的棧式結(jié)構(gòu).

示例代碼:

void intCleanup(int *num){
    NSLog(@"cleanup------%d",*num);
}

void stringCleanup(NSString **str){
    NSLog(@"cleanup------%@",*str);
}

void rectCleanup(CGRect *rect){
    CGRect temp = *rect;
    NSString *str = NSStringFromCGRect(temp);
    NSLog(@"cleanup------%@",str);
}


 int a __attribute__((cleanup(intCleanup))) = 10;
    {
        NSString *string __attribute__((cleanup(stringCleanup))) = @"string";
        CGRect rect __attribute__((cleanup(rectCleanup))) = {0,0,1,1};
    }
    
    
    輸出結(jié)果為:
    2016-07-22 10:09:36.621 Study[14308:5498861] cleanup------{{0, 0}, {1, 1}}
2016-07-22 10:09:36.622 Study[14308:5498861] cleanup------string
2016-07-22 10:09:36.622 Study[14308:5498861] cleanup------10
    

討論:如果修飾了某個(gè)對(duì)象,那么cleanup和dealloc,誰(shuí)先執(zhí)行?
測(cè)試代碼如下:

void objectCleanup(NSObject **obj){
    NSLog(@"cleanup------%@",*obj);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    ViewController *vc __attribute__((cleanup(objectCleanup))) = [[ViewController alloc] init];
}

- (void)dealloc{
    NSLog(@"dealloc");
}

輸出結(jié)果如下:
2016-07-22 10:23:08.839 Study[14319:5502769] cleanup------<ViewController: 0x13fe881e0>
2016-07-22 10:23:08.840 Study[14319:5502769] dealloc

可以明顯看出,cleanup先于對(duì)象的dealloc執(zhí)行.

  • 在block中的用法:在block中使用,先看例子:
//指向block的指針,覺(jué)得不好理解可以用typeof
void blockCleanUp(void(^*block)()){
    (*block)();
}

 void (^block)(void) __attribute__((cleanup(blockCleanUp))) = ^{
        NSLog(@"finish block");
    };

這個(gè)好處就是,不用等到block最后才寫(xiě)某些代碼,我們可以把它放在block的任意位置,防止忘記.

overloadable

用于c語(yǔ)言函數(shù),可以定義若干個(gè)函數(shù)名相同腿时,但參數(shù)不同的方法,調(diào)用時(shí)編譯器會(huì)自動(dòng)根據(jù)參數(shù)選擇函數(shù)原型:

__attribute__((overloadable)) void print(NSString *string){
    NSLog(@"%@",string);
}

__attribute__((overloadable)) void print(int num){
    NSLog(@"%d",num);
}

//調(diào)用
print(10);
print(@"哈哈");

objc_runtime_name

看到runtime是不是就感覺(jué)高大上,沒(méi)錯(cuò)這個(gè)也跟運(yùn)行時(shí)有關(guān).作用是將將類或協(xié)議的名字在編譯時(shí)指定成另一個(gè).示例如下:

__attribute__((objc_runtime_name("NSObject")))
@interface SGObject :NSObject

@end

 //調(diào)用
 NSLog(@"%@",[SGObject class]);
 //輸出
 2016-07-22 11:18:00.934 Study[14355:5516261] NSObject

可以用來(lái)做代碼混淆.

更多請(qǐng)看官網(wǎng):
https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭宾,一起剝皮案震驚了整個(gè)濱河市批糟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捏雌,老刑警劉巖跃赚,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異性湿,居然都是意外死亡纬傲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)肤频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叹括,“玉大人,你說(shuō)我怎么就攤上這事宵荒≈祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵报咳,是天一觀的道長(zhǎng)侠讯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)暑刃,這世上最難降的妖魔是什么厢漩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮岩臣,結(jié)果婚禮上溜嗜,老公的妹妹穿的比我還像新娘。我一直安慰自己架谎,他們只是感情好炸宵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谷扣,像睡著了一般土全。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上会涎,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天涯曲,我揣著相機(jī)與錄音,去河邊找鬼在塔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拨黔,可吹牛的內(nèi)容都是我干的蛔溃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贺待!你這毒婦竟也來(lái)了徽曲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麸塞,失蹤者是張志新(化名)和其女友劉穎秃臣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哪工,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奥此,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雁比。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稚虎。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖偎捎,靈堂內(nèi)的尸體忽然破棺而出蠢终,到底是詐尸還是另有隱情,我是刑警寧澤茴她,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布寻拂,位于F島的核電站,受9級(jí)特大地震影響丈牢,放射性物質(zhì)發(fā)生泄漏祭钉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一赡麦、第九天 我趴在偏房一處隱蔽的房頂上張望朴皆。 院中可真熱鬧,春花似錦泛粹、人聲如沸遂铡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扒接。三九已至,卻和暖如春们衙,著一層夾襖步出監(jiān)牢的瞬間钾怔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工蒙挑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宗侦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓忆蚀,卻偏偏與公主長(zhǎng)得像矾利,于是被迫代替她去往敵國(guó)和親姑裂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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