刚开始接触OC属性和变量的时候,真的把它们搞混了,不单是我,和我一块学习的也把它没有搞清楚,这不花了一些时间整理了属性和变量的区别。当然这只是个人的看法,有错之处 还请不吝指正。
下面以例子来解释:
例1:
//val.h头文件
// Created by tsc on 15-11-1.
// Copyright (c) 2015年 tsc. All rights reserved.
#import <Foundation/Foundation.h>
@interface Val : NSObject
{
int value; //只有一个变量,而没有setter和getter方法
}
-(void) print; //负责打印变量的值
@end
//val.m实现文件
#import "val.h"
@implementation Val
-(void) print
{
value = 3;
NSLog(@"%d",value);
}
#import <Foundation/Foundation.h>
#import "val.h" //引用头文件
int main(int argc, const char * argv[])
{
@autoreleasepool {
Val *v = [Val new];
[v print]; //打印value的值
}
return 0;
}
在没有写setter和getter方法时使用如图:
这里我们看到val 类只一个变量,而且它不能使用settert 和getter方法
例2:
//main.m
#import <Foundation/Foundation.h>
#import "val.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Val *v = [Val new];
[v setValue:5];
NSLog(@"rec = %d",[v value]);
}
return 0;
}
// val.h
#import <Foundation/Foundation.h>
@interface Val : NSObject
{
int value;
}
-(void) print;
-(void) setValue:(int)d;
-(int) value;
@end
// val.m
#import "val.h"
@implementation Val
-(void) print
{
value = 3;
NSLog(@"%d",value);
}
-(void) setValue:(int)d
{
value = d;
}
-(int) value
{
return value;
}
@end
上面是使用了手动合成的setter和getter方法
运行结果如下图:
v.value 中的 . 它调用的是方法,在=号左边调用设置方法,在=号右边调用取值方法。
可以看到它可以正常运行,记住变量仅仅是一个变量(下面看例3)
例3:
// main.m
#import <Foundation/Foundation.h>
#import "val.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Val *v = [Val new];
v.value = 5;;
int rec = v.value;
[v print];
NSLog(@"rec = %d",rec);
}
return 0;
}
// val.h
#import <Foundation/Foundation.h>
@interface Val : NSObject
@property int value; //换成了这个部分
-(void) print;
@end
// val.m
#import "val.h"
@implementation Val
-(void) print
{
_value = 3; //对比前面这里变成了这样,其实如果想继续像例2一样使用,可以看例4
//使用value = 3;的话会报错,请看下图;
NSLog(@"%d",_value);
}
@end
上图是使用value引起的错误,也就是说value这个名字它不再是变量。
运行结果如下图:
结果和例2的是一样的。
现在还别忙着总结,接下来看例4
例4:
// main.m
#import <Foundation/Foundation.h>
#import "val.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Val *v = [Val new];
v.value = 5;;
int rec = v.value;
[v print];
NSLog(@"rec = %d",rec);
}
return 0;
}
// val.h
#import <Foundation/Foundation.h>
@interface Val : NSObject
@property int value; //换成了这个部分
-(void) print;
@end
// val.m
#import "val.h"
@implementation Val
@synthesize value; //比例3多加了这个部分
-(void) print
{
NSLog(@"value = %d",value);
}
@end
例4运行结果如下图:
从上面我们可能总结出来一个问题。
@property 和@synthesize 它们帮助我们合成setter和getter 方法.而且如题 中
@property int value; 它自动为我们生成了一个变量_value,也就是说value这个名字不再是一个变量名,它只是一个属性名称。而我们在写@synthesize value时,实际上是为value 这个属性重新定义 一个变量名,也就是将 _value这个变量名换成了value 。那么 _value就不再存在了。其实@synthesize value;也可以改成你自己定义的变量如
@synthesize value = tsc;
测试结果如下图:
到些结束,有什么疑问,请联系