runtime 常用方法實(shí)例

Runtime(也就是運(yùn)行時(shí))舶斧,它基本上是用C和匯編寫的,這個(gè)庫(kù)使得C語(yǔ)言有了面向?qū)ο蟮哪芰ΑK粤?xí)慣了面向?qū)ο缶幊痰男』飩兒孟駥?duì)于C的API一般都不太友好,但是又有很多C的API強(qiáng)大到別人問(wèn)你你不知道那你都抬不起頭媒役,Runtime就是其中之一。關(guān)于它的傳說(shuō)有很多宪迟,可以說(shuō)在有的人手里牛逼的不可一世酣衷。下面我們主要看一下runtime基本使用的方法:

1、獲取當(dāng)前類變量列表

不啰嗦直接上代碼:

  獲取當(dāng)前類 的所以變量
  unsigned int outCount;
    Ivar *ivars = class_copyIvarList([PeopleModel class], &outCount);
    SGTLog(@"\n\n\nPeopleModel類包含 變量數(shù)量:%u", outCount);
    
    for (int i = 0; i < outCount; i++) {
        Ivar ivar = ivars[i];
        const char *ivarName = ivar_getName(ivar);
        const char *ivarType = ivar_getTypeEncoding(ivar);
        SGTLog(@"PeopleModel類包含 變量名為:%s 變量類型為:%s", ivarName, ivarType);
    }
    //由于ARC只適用于Foundation等框架次泽,對(duì)runtime 等并不適用穿仪,所以ivars需要free()手動(dòng)釋放。
    free(ivars);
    
    獲取當(dāng)前類 實(shí)例對(duì)象的所以變量
    unsigned int count_p;
    Ivar *ivars_p = class_copyIvarList([self.people class], &count_p);
    SGTLog(@"\n\n\nself.people實(shí)例包含 變量數(shù)量:%u", count_p);
    
    for (int i = 0; i < count_p; i++) {
        Ivar ivar_p = ivars_p[i];
        const char *ivarName_p = ivar_getName(ivar_p);
        const char *ivarType_p = ivar_getTypeEncoding(ivar_p);
        SGTLog(@"self.people實(shí)例包含 變量名為:%s 變量類型為:%s", ivarName_p, ivarType_p);
    }
    
    free(ivars_p);
    
    

打印結(jié)果

PeopleModel類包含 變量數(shù)量:7
2019-05-13 14:31:33.967546+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_weight 變量類型為:f
2019-05-13 14:31:33.967704+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_sex 變量類型為:B
2019-05-13 14:31:33.967838+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_height 變量類型為:f
2019-05-13 14:31:33.967978+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_age 變量類型為:q
2019-05-13 14:31:33.968102+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_province 變量類型為:@"NSString"
2019-05-13 14:31:33.968225+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_city 變量類型為:@"NSString"
2019-05-13 14:31:33.968349+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:78]
PeopleModel類包含 變量名為:_county 變量類型為:@"NSString"
2019-05-13 14:31:33.968561+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:85]


self.people實(shí)例包含 變量數(shù)量:7
2019-05-13 14:31:33.969885+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_weight 變量類型為:f
2019-05-13 14:31:33.970044+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_sex 變量類型為:B
2019-05-13 14:31:33.970163+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_height 變量類型為:f
2019-05-13 14:31:33.970283+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_age 變量類型為:q
2019-05-13 14:31:33.970397+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_province 變量類型為:@"NSString"
2019-05-13 14:31:33.970513+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_city 變量類型為:@"NSString"
2019-05-13 14:31:33.970630+0800 RuntimeDemo[19130:320593] 
-[ViewController testIvar] [ViewController.m  Line:91]
self.people實(shí)例包含 變量名為:_county 變量類型為:@"NSString"
2意荤、獲取當(dāng)前類屬性列表

代碼如下:

 unsigned int outPropertyCount;
    objc_property_t *propertys = class_copyPropertyList([PeopleModel class],&outPropertyCount);
    SGTLog(@"\n\n\nPeopleModel類包含 屬性數(shù)量:%u", outPropertyCount);
    for (int i = 0; i < outPropertyCount; i++) {
        objc_property_t property = propertys[i];
        const char *propertyName = property_getName(property);
        const char *propertyAttributes = property_getAttributes(property);
        SGTLog(@"nPeopleModel類包含 屬性名為:%s 變量屬性為:%s", propertyName, propertyAttributes);
    }
    free(propertys);
    

打印結(jié)果啊片,People類共有8個(gè)屬性

PeopleModel類包含 屬性數(shù)量:8
2019-05-13 14:52:17.738854+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:fatherName 變量屬性為:T@"NSString",C,D,N
2019-05-13 14:52:17.739009+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:motherName 變量屬性為:T@"NSString",C,D,N
2019-05-13 14:52:17.739128+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:age 變量屬性為:Tq,N,V_age
2019-05-13 14:52:17.739276+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:sex 變量屬性為:TB,N,V_sex
2019-05-13 14:52:17.739404+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:height 變量屬性為:Tf,N,V_height
2019-05-13 14:52:17.739541+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:province 變量屬性為:T@"NSString",C,N,V_province
2019-05-13 14:52:17.739697+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:city 變量屬性為:T@"NSString",C,N,V_city
2019-05-13 14:52:17.739849+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:109]
nPeopleModel類包含 屬性名為:county 變量屬性為:T@"NSString",C,N,V_county
2019-05-13 14:52:17.740080+0800 RuntimeDemo[19435:328966] 
-[ViewController testProperty] [ViewController.m  Line:116]

3、獲取當(dāng)前類方法列表

代碼如下:

 unsigned int outMethodCount;
    Method *methods = class_copyMethodList([PeopleModel class], &outMethodCount);
    SGTLog(@"\n\n\nPeopleModel類包含 方法數(shù)量:%u", outMethodCount);
    for (int i = 0; i < outMethodCount; i++) {
        Method method = methods[i];
        SEL method_name = method_getName(method);//方法名
        const char * method_types  = method_getTypeEncoding(method);//方法類型編碼
        IMP method_imp = method_getImplementation(method);//方法實(shí)現(xiàn)
        unsigned int ArgumentsNum  =  method_getNumberOfArguments(method);//參數(shù)個(gè)數(shù)
        SGTLog(@"PeopleModel類包含 方法 名稱為:%@ 方法類型為:%s  method_imp %p 參數(shù)個(gè)數(shù): %d ",NSStringFromSelector(method_name), method_types,&method_imp,ArgumentsNum);
    }
    free(methods);
    

打印結(jié)果顯示玖像,People共有方法22個(gè)包含屬性的setter getter 方法紫谷,也包含分類中的方法

PeopleModel類包含 方法數(shù)量:22
2019-05-13 17:30:45.841292+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:fatherName 方法類型為:@16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.841507+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:motherName 方法類型為:@16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.841651+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:isEat 方法類型為:B16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.841807+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:isEat 方法類型為:B16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.841945+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:isWork 方法類型為:B16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.842094+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setFatherName: 方法類型為:v24@0:8@16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.842221+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setMotherName: 方法類型為:v24@0:8@16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.853483+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:isHeight: 方法類型為:B24@0:8@16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.853635+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:sex 方法類型為:B16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.853767+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setSex: 方法類型為:v20@0:8B16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.853892+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:province 方法類型為:@16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.854019+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setProvince: 方法類型為:v24@0:8@16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.854145+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:county 方法類型為:@16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.854278+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setCounty: 方法類型為:v24@0:8@16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.854402+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:.cxx_destruct 方法類型為:v16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.854522+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:dealloc 方法類型為:v16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.854748+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:height 方法類型為:f16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.855102+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setHeight: 方法類型為:v20@0:8f16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.855471+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setAge: 方法類型為:v24@0:8q16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.855768+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:age 方法類型為:q16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.856054+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:setCity: 方法類型為:v24@0:8@16  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 3
2019-05-13 17:30:45.856447+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:137]
PeopleModel類包含 方法 名稱為:city 方法類型為:@16@0:8  method_imp 0x7ffeea98c7f8 參數(shù)個(gè)數(shù): 2
2019-05-13 17:30:45.856783+0800 RuntimeDemo[25078:406610] 
-[ViewController testMethod] [ViewController.m  Line:146]
4、替換當(dāng)前類實(shí)例方法的實(shí)現(xiàn)(類方法同樣)

一樣捐寥,不啰嗦直接上代碼

 /// 替換方法實(shí)現(xiàn)
    SEL originalSelector = @selector(isEat);
    SEL swizzledSelector = @selector(isWork);
    
//    Method originalMethod = class_getInstanceMethod([PeopleModel class], originalSelector);
//    Method swizzledMethod = class_getInstanceMethod([PeopleModel class], swizzledSelector);
   
    //self.people 類型已被賦值為Model
    Method originalMethod = class_getInstanceMethod([self.people class], originalSelector);
    Method swizzledMethod = class_getInstanceMethod([self.people class], swizzledSelector);
//    if (swizzledMethod == nil) {
//        return;
//    }
    
    //1笤昨、交換兩個(gè)方法的實(shí)現(xiàn)
    method_exchangeImplementations(originalMethod, swizzledMethod);
    
//    IMP    originalIMP    = method_getImplementation(originalMethod);
//    IMP    swizzledIMP    = method_getImplementation(swizzledMethod);
//    //2、用swizzledMethod的實(shí)現(xiàn)取代originalMethod的實(shí)現(xiàn)
//    class_replaceMethod([self.people class], originalSelector, swizzledIMP, method_getTypeEncoding(swizzledMethod));
//
//    //3握恳、把swizzledVCMethod方法的實(shí)現(xiàn)賦值給originalMethod
//    method_setImplementation(originalMethod,swizzledIMP);
 
    //調(diào)用方法測(cè)試 //如果前邊調(diào)用了[self textClass]方法 self.people 類型已被賦值為Model 瞒窒,相當(dāng)于調(diào)用Model 實(shí)例的isEat方法,Model 未實(shí)現(xiàn)isEat方法乡洼,Model類作了消息截取崇裁,可以調(diào)用成功
    [self.people isEat];

替換方法的實(shí)現(xiàn)有三種方法

1、交換兩個(gè)方法的實(shí)現(xiàn)
method_exchangeImplementations(originalMethod,swizzledMethod);

2束昵、用swizzledMethod的實(shí)現(xiàn)取代originalMethod的實(shí)現(xiàn)
class_replaceMethod([self.people class], originalSelector,method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));

3拔稳、把swizzledVCMethod方法的實(shí)現(xiàn)賦值給originalMethod
method_setImplementation(originalMethod,method_getImplementation(swizzledMethod));

這三種方法都可以在調(diào)用originalMethod 的時(shí)候替換為swizzledMethod的實(shí)現(xiàn)

我們?cè)陧?xiàng)目中調(diào)用沒(méi)有實(shí)現(xiàn)的方法會(huì)崩潰,怎么避免呢妻怎?我們可以通過(guò)消息轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn),代碼如下泞歉,
并且重寫消息轉(zhuǎn)發(fā)的方法:
方法一:

//Model.m 文件中創(chuàng)建
-(void)noObjMethod{
    NSLog(@"未實(shí)現(xiàn)這個(gè)實(shí)例方法");
}
+(void)noClassMethod{
    NSLog(@"未實(shí)現(xiàn)這個(gè)類方法");
}
//并且重寫消息轉(zhuǎn)發(fā)的方法:
// 當(dāng)一個(gè)對(duì)象調(diào)用未實(shí)現(xiàn)的方法逼侦,會(huì)調(diào)用這個(gè)方法處理,并且會(huì)把對(duì)應(yīng)的方法列表傳過(guò)來(lái).
//注意:實(shí)例方法是存在于當(dāng)前對(duì)象對(duì)應(yīng)的類的方法列表中
+(BOOL)resolveInstanceMethod:(SEL)sel{
    SEL aSel = NSSelectorFromString(@"noObjMethod");
    Method aMethod = class_getInstanceMethod(self, aSel);
    BOOL addMethod = class_addMethod(self, sel, method_getImplementation(aMethod), "v@:");
    return addMethod;
}
// 當(dāng)一個(gè)類調(diào)用未實(shí)現(xiàn)的方法,會(huì)調(diào)用這個(gè)方法處理,并且會(huì)把對(duì)應(yīng)的方法列表傳過(guò)來(lái).
//注意:類方法是存在于類的元類的方法列表中
+(BOOL)resolveClassMethod:(SEL)sel{
    SEL aSel = NSSelectorFromString(@"noClassMethod");
    Method aMethod = class_getClassMethod(self, aSel);
    BOOL addMethod =  class_addMethod(object_getClass(self), sel, method_getImplementation(aMethod), "v@:");
    return addMethod;
}

打印結(jié)果

2019-05-13 18:31:46.605919+0800 RuntimeDemo[28185:448815] 未實(shí)現(xiàn)這個(gè)實(shí)例方法

方法二:

//消息轉(zhuǎn)發(fā)
-(id)forwardingTargetForSelector:(SEL)aSelector{
    //獲取people類
    Class peopleClass = NSClassFromString(@"PeopleModel");
    
    if (class_respondsToSelector(peopleClass, aSelector)) {
        return [[peopleClass alloc]init];
    }
    return self;
}

打印結(jié)果

2019-05-13 18:35:25.711990+0800 RuntimeDemo[28222:449877] 
-[PeopleModel(Family) isEat] [PeopleModel+Family.m  Line:22]
 (null) 沒(méi)有吃飯

方法三:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if ([NSStringFromSelector(aSelector) isEqualToString:@"isEat"]) {
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }
    return [super methodSignatureForSelector:aSelector];
}
-(void)forwardInvocation:(NSInvocation *)anInvocation{
    [anInvocation invokeWithTarget:[[NSClassFromString(@"PeopleModel") alloc] init]];
}

打印結(jié)果

2019-05-13 18:40:26.972046+0800 RuntimeDemo[28102:446152] 
-[PeopleModel(Family) isEat] [PeopleModel+Family.m  Line:22]
 (null) 沒(méi)有吃飯

以上三種方法都可以實(shí)現(xiàn)消息轉(zhuǎn)發(fā)腰耙,在調(diào)用isEat時(shí)進(jìn)行處理榛丢,不會(huì)引起崩潰。

Runtime使用實(shí)例就先到這里了挺庞。
測(cè)試Demo地址直通車

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晰赞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掖鱼,老刑警劉巖然走,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異戏挡,居然都是意外死亡芍瑞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門褐墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拆檬,“玉大人悼院,你說(shuō)我怎么就攤上這事书释。” “怎么了甩栈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逝钥,是天一觀的道長(zhǎng)屑那。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晌缘,這世上最難降的妖魔是什么齐莲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮磷箕,結(jié)果婚禮上选酗,老公的妹妹穿的比我還像新娘。我一直安慰自己岳枷,他們只是感情好芒填,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著空繁,像睡著了一般殿衰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盛泡,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天闷祥,我揣著相機(jī)與錄音,去河邊找鬼傲诵。 笑死凯砍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拴竹。 我是一名探鬼主播悟衩,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栓拜!你這毒婦竟也來(lái)了座泳?” 一聲冷哼從身側(cè)響起惠昔,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挑势,沒(méi)想到半個(gè)月后镇防,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薛耻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年营罢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饼齿。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饲漾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缕溉,到底是詐尸還是另有隱情考传,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布证鸥,位于F島的核電站僚楞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枉层。R本人自食惡果不足惜泉褐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸟蜡。 院中可真熱鬧膜赃,春花似錦、人聲如沸揉忘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泣矛。三九已至疲眷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間您朽,已是汗流浹背狂丝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哗总,地道東北人几颜。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像魂奥,于是被迫代替她去往敵國(guó)和親菠剩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子易猫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20161102/17920.html 因?yàn)镺b...
    F麥子閱讀 668評(píng)論 0 1
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 731評(píng)論 0 2
  • 本文詳細(xì)整理了 Cocoa 的 Runtime 系統(tǒng)的知識(shí)耻煤,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 800評(píng)論 0 4
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 758評(píng)論 0 1
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門動(dòng)態(tài)語(yǔ)言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢哈蝇?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,192評(píng)論 0 7