
可以看到這個(gè)CAMediaTiming聲明的全部是property,但其實(shí)這個(gè)協(xié)議本質(zhì)上還是定義了方法接口而已,property的本質(zhì)只是定義一組get和set方法。但是在使用時(shí)可能還是有點(diǎ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類,遵循MyProtocal,在.m文件里只是重寫了description方法,并未做其他事,然后在viewDidLoad里,生成一個(gè)TWPersion對(duì)象,并調(diào)用其description方法,在description里會(huì)調(diào)用self.name,即在MyProtocal聲明的屬性。代碼很簡單,然后我們運(yùn)行demo,可以看到app crash了,錯(cuò)誤信息如下:

錯(cuò)誤信息很明確,我們的TWPersion沒有實(shí)現(xiàn)setName方法,的確如此,我們?cè)?m文件里確實(shí)沒有重寫setName方法。所以在peotocal里使用property時(shí),與在class里直接定義property時(shí)還是不太一樣,最簡單的方法即自己手動(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)類里面自己實(shí)現(xiàn)get和set方法,最快速的方法就是讓編譯起幫我們生成get和set代碼,如果需要自己重寫,那也是可以的。很多時(shí)候,如果不需要自定義的get和set方法,在protocal里定義property時(shí),只要@synthesize x=_x; 即可,其它用法跟在class里定義的屬性一模一樣。
Demo地址