/*
1.自动synthesis,在新版本的OC中,如果在Interface中定义了某个属性,编译器会自动添加
getter(默认为属性命)和setter(默认为setPropertyName)属性。当然也可以自己定义这个方法。
只需要在属性定义前加上(getter=自定义函数)
2.虽然可以用dot语法访问属性,但是一般不用。函数是不可以用dot语法的。
3.类内部属性需要用self访问,但是在写init函数时,会出现混淆
所以类内部属性也经常在前面加下划线的形式表示。
4.如果不想用默认的setter和getter,也可以不加@property,这时需要在@interface紧接着定义
定义的属性需要包含在{}中
5.实例变量,放在@interface和@implementation的大括号中,不带@property的为实例变量。
这些变量没有getter,和setter,不能用self和下划线访问,不能通过实例.var访问,仅仅是被定义在类中的变量。
*/
#import <Foundation/Foundation.h>
@interface TestClass:NSObject
{
//紧跟着@interface添加{},在这个大括号中可以定义没有@property的属性
int noGetterSetter;
}
@property NSString *className;
@property (getter=isOK) int OK; //指定getter的方法
@property (readonly) int number;
-(void) mySetNoGetterSetter:(int)data;
-(id) init;
@end
@implementation TestClass
int test = 10; //这个是全局变量,不仅在类中可以访问,在类外边也可以。
-(id)init
{
if ( self = [super init] )
{
noGetterSetter = 0;
}
return self;
}
-(NSString *) getClassName
{
test = 12;
//self.number = 20; //只读的属性只能在init中赋初值
//类内部属性需要用self访问,但是在写init函数时,会出现混淆
//所以类内部属性也经常在前面加下划线的形式表示。
_className = @"测试下划线和self";
return self.className;
}
-(void) mySetNoGetterSetter:(int)data
{
noGetterSetter = data;
}
@end
int main(int argc, const char * argv[])
{
TestClass *c = [[TestClass alloc]init];
[c setClassName:@"hello"]; //默认添加的synthesis
NSLog(@"%@", [c className]);
//[c setNumber:3]; //由于该属性是只读的,所以没有默认的setter,只有getter
NSLog(@"readonly property: %d", [c number]);
NSLog(@"global var: %d", test); //全局变量
//c.noGetterSetter = 3;这个没有getter属性,不能直接访问
//[c setNoGetterSetter:3]; 不带@property的实例变量是没有setter的。
[c mySetNoGetterSetter:3];
c.OK = YES;//可以用dot语法访问属性
//c.isOK:@"hi"; 函数是不可以用dot语法
return 0;
}