2016-11-29 75 views
-2

我是Objective C的新手,並且對代碼的行爲有些困惑。Objective C不兼容

.m文件:

@interface MEDTNetworkAuthentication() 

@property (nonatomic,retain) NSString *certificate; 

@implementation MEDTNetworkAuthentication 

-(void)setCertificate:(NSData*) certificateData 
{ 
    self.certificate=[self getCarelinkCertificateUsingData:certificateData]; 
    return; 
} 

@end 

.h文件:在之前的代碼現在

#import <Foundation/Foundation.h> 

@protocol NetworkAuthenticationDelegate; 

@interface MEDTNetworkAuthentication : NSObject<NSURLSessionDelegate> 

-(void)authenticate:(NSData*) certificateData andAuthData:(NSString*) authorization andURLSession:(NSURLSession*) careLinkAuthenticationSession; 
-(void)setCertificate:(NSData*) certificateData; 

@end 

,該authenticate在現有的功能。之前,我在設置self.certificate之後更改了放置return;,並且其功能如預期。但是因爲我想要以前的功能並且不想擺脫這一切,所以我想創建一個新功能(setCertificate)。但是,當我將該功能添加到.h.m文件時,現在兩條線設置self.certertificate給我一個錯誤,說Assigning to 'NSData *__strong' from incompatible type 'NSString *'。當我從.h文件中刪除setCertificate這一行時,錯誤消失,但我現在(明顯)無法在m文件外部訪問該函數。這是怎麼回事?

+0

您遺漏了'cert'屬性的數據類型。添加到你的問題。 – rmaddy

+3

僅供參考 - 當您需要幫助提供問題的代碼時,請將真實的確切代碼複製並粘貼到您的問題中。你的問題已經減少太多了。 – rmaddy

+0

更新 - 對不起 – Kevin

回答

4

現在你已經發布真正的屬性名稱和真正的方法名稱的代碼,問題是顯而易見的。

正如我猜測,你的財產被命名爲certificate,而不是cert。所以你的setCertificate:方法隱藏了你的certificate屬性的setter方法。

由於certificate屬性的類型爲NSString,並且您的setCertificate:方法採用NSData類型的參數,所以存在衝突。

正確的解決方案是重命名您的setCertificate:方法,以免與您的財產衝突。

也許將其更改爲setCertificateData:

+0

就是這樣 - 謝謝!抱歉張貼僞碼... – Kevin

1

你是因爲這個功能

-(NSString *)getCert:(NSData *)certData 
{ 
    //do something 
} 

你是返回一個NSStringself.cert收到此錯誤是NSData類型的期望的變量NSDataNSString

+0

已更新證明cert實際上是一個NSString – Kevin

0

物業cert似乎是類型的NSString的,並且你正在向它傳遞一個NSData實例。也許嘗試使用NSString的initWithData:encoding: