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即可解決