可以看到這個(gè)CAMediaTiming聲明的全部是property确虱,但其實(shí)這個(gè)協(xié)議本質(zhì)上還是定義了方法接口而已含友,property的本質(zhì)只是定義一組get和set方法。但是在使用時(shí)可能還是有點(diǎn)小問(wèn)題需要注意校辩。直接看demo:
@protocol MyProtocal <NSObject>
@property (nonatomic, copy) NSString *name;
@end
#import <Foundation/Foundation.h>
#import "MyProtocal.h"
@interface TWPersion : NSObject<MyProtocal>
@end
#import "TWPersion.h"
@implementation TWPersion
- (NSString*)description{
return [NSString stringWithFormat:@"%@",self.name];
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
TWPersion *p = [[TWPersion alloc] init];
p.name = @"wang";
NSLog(@"%@",p.description);
}
定義了一個(gè)MyProtocal的協(xié)議窘问,然后定義一個(gè)TWPersion類(lèi),遵循MyProtocal宜咒,在.m文件里只是重寫(xiě)了description方法惠赫,并未做其他事,然后在viewDidLoad里故黑,生成一個(gè)TWPersion對(duì)象儿咱,并調(diào)用其description方法,在description里會(huì)調(diào)用self.name场晶,即在MyProtocal聲明的屬性混埠。代碼很簡(jiǎn)單,然后我們運(yùn)行demo诗轻,可以看到app crash了钳宪,錯(cuò)誤信息如下:
錯(cuò)誤信息很明確,我們的TWPersion沒(méi)有實(shí)現(xiàn)setName方法,的確如此吏颖,我們?cè)?m文件里確實(shí)沒(méi)有重寫(xiě)setName方法搔体。所以在peotocal里使用property時(shí),與在class里直接定義property時(shí)還是不太一樣侦高,最簡(jiǎn)單的方法即自己手動(dòng)加入如下代碼
@synthesize name = _name;
加入代碼后的.m文件里代碼如下:
#import "TWPersion.h"
@implementation TWPersion
@synthesize name = _name;
- (NSString*)description{
return [NSString stringWithFormat:@"%@",self.name];
}
@end
總結(jié)
本質(zhì)上如果在protocal里定義了屬性嫉柴,就要在實(shí)現(xiàn)類(lèi)里面自己實(shí)現(xiàn)get和set方法厌杜,最快速的方法就是讓編譯起幫我們生成get和set代碼奉呛,如果需要自己重寫(xiě),那也是可以的夯尽。很多時(shí)候瞧壮,如果不需要自定義的get和set方法,在protocal里定義property時(shí)匙握,只要@synthesize x=_x; 即可咆槽,其它用法跟在class里定義的屬性一模一樣。
Demo地址