這兩天同學總是問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;
}
偷懶沒有實現方法,但是同樣沒有報錯,也就說明證實了猜想。