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;

代碼通過,沒有錯誤,說明.點語法是用來訪問屬性的。再進一步猜想@propetery是聲明set、get方法,要是我有set、get方法沒有聲明@propetery可不可以呢,試試就知道

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM