可以看到這個CAMediaTiming聲明的全部是property,但其實這個協議本質上還是定義了方法接口而已,property的本質只是定義一組get和set方法。但是在使用時可能還是有點小問題需要注意。直接看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);
}
定義了一個MyProtocal的協議,然后定義一個TWPersion類,遵循MyProtocal,在.m文件里只是重寫了description方法,并未做其他事,然后在viewDidLoad里,生成一個TWPersion對象,并調用其description方法,在description里會調用self.name,即在MyProtocal聲明的屬性。代碼很簡單,然后我們運行demo,可以看到app crash了,錯誤信息如下:
Paste_Image.png
錯誤信息很明確,我們的TWPersion沒有實現setName方法,的確如此,我們在.m文件里確實沒有重寫setName方法。所以在peotocal里使用property時,與在class里直接定義property時還是不太一樣,最簡單的方法即自己手動加入如下代碼
@synthesize name = _name;
加入代碼后的.m文件里代碼如下:
#import "TWPersion.h"
@implementation TWPersion
@synthesize name = _name;
- (NSString*)description{
return [NSString stringWithFormat:@"%@",self.name];
}
@end
總結
本質上如果在protocal里定義了屬性,就要在實現類里面自己實現get和set方法,最快速的方法就是讓編譯起幫我們生成get和set代碼,如果需要自己重寫,那也是可以的。很多時候,如果不需要自定義的get和set方法,在protocal里定義property時,只要@synthesize x=_x; 即可,其它用法跟在class里定義的屬性一模一樣。
Demo地址