iOS中@protocal中定義@property的問題。

在Objective-C中使用@protocol定義一組方法規(guī)范,實(shí)現(xiàn)此協(xié)議的類必須實(shí)現(xiàn)對(duì)應(yīng)的方法(@optional的方法不用必須實(shí)現(xiàn))。熟悉面向?qū)ο蟮耐贾澜涌诒旧硎菍?duì)象行為描述的協(xié)議規(guī)范。也就是說在Objective-C中@protocol和其他語言的接口定義是類似的,只是在Objective-C中interface關(guān)鍵字已經(jīng)用于定義類了,因此它不會(huì)再像C#、Java中使用interface定義接口了。一般我們@protocol定義方法,有時(shí)候也會(huì)看到只有property(屬性)的情況,在core animation中,CALayer遵循了這個(gè)CAMediaTiming這個(gè)協(xié)議,如圖所示:

可以看到這個(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ò)誤信息如下:


Paste_Image.png

錯(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地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,134評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,602評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評(píng)論 18 399
  • 如今的你我 不知人生苦楚 忍不住歡喜 與沒完沒了的孤獨(dú) 所以肯守著彼此 就像冬夜的篝火 和燃燒的干木 就像無憂的路...
    猩野水味閱讀 930評(píng)論 1 8
  • 自打加入了小灶群,就被許許多多的人提起的《書都不會(huì)讀,你還想成功》這本書所吸引,貓叔說這本書是改變他命運(yùn)的一本書,...
    翎馨閱讀 200評(píng)論 0 0

友情鏈接更多精彩內(nèi)容