OC .(點)與->(箭頭)用法區別

OC裏.和->的用法區別, 一位前輩的解釋很生動形象, 貼過來大家分享 

 #import <Foundation/Foundation.h>

@interface Test : NSObject
{
  int temp;	//成員變量
}
@end
@implementation Test
@end

int main()
{

  Test *t = [[Test alloc] init];
  t->temp = 100;
  NSLog(@"%d",t->temp);
  return 0;
}

這裏

t->temp = 100;
NSLog(@"%d",t->temp);

這兩行中的t->temp會提示錯誤,錯誤說明爲instance varviable “temp” is protected。說明是可以訪問的,但是因爲受保護所以報錯,那我們把權限改成public試試。

    @public
    int temp;    //成員變量

結果顯示通過,沒有錯誤,說明想法是對的。

接下來再看看.點語法

 #import <Foundation/Foundation.h>

@interface Test : NSObject
{
  int temp;	//成員變量
}
@end
@implementation Test
@end

int main()
{

  Test *t = [[Test alloc] init];
  t.temp = 100;
  NSLog(@"%d",t.temp);
  return 0;
}

把代碼中的t->temp改成lt.temp,發現又會報錯,錯誤說明爲Propetery temp not found。。。,也即是說沒有找到temp這個屬性,當然找不到,因爲我們沒有定義這個屬性。 這時再在成員變量的聲明後加一行代碼 

@property int temp;

代碼通過,沒有錯誤,說明.點語法是用來訪問屬性的。

、get方法,要是我有set、 

,試試就知道

 #import <Foundation/Foundation.h>

@interface Test : NSObject
{
  int temp;	//成員變量
}
-(void)setTemp:(int)temp;
-(int)Temp;
@end
@implementation Test

-(void)setTemp:(int)temp
{
}
-(int)Temp
{
}
@end

int main()
{

  Test *t = [[Test alloc] init];
  t->temp = 100;
  NSLog(@"%d",t->temp);
  return 0;
}

偷懶沒有實現方法,但是同樣沒有報錯,也就說明證實了猜想。

至此大概清楚.(點)和->(箭頭)的區別了:

.(點語法)是訪問類的屬性,本質是調用set、get方法。

->是訪問成員變量,但成員變量默認受保護,所以常常報錯,手動設爲public即可解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章