1,Member variables 可以声明在.h 和.m 中有一定的作用域 。成员变量默认外部访问不到,子类要访问,就要在h文件中申明。
OC属性在h文件中和在m文件中声明是有区别的。区别就是,在h文件中声明的属性,外部类可以通过“类实例.属性”来调用,但在m文件中声明的则不可以获取setter and getter方法,只能是通过setValue:forKey和valueForKey来实现。
位于h声明文件中的变量(deafult @protected)
#import <UIKit/UIKit.h>
@interface CurrentDetailViewController : BaseViewController{
//括号里边的都属于成员变量
ProductDetails *myProductDetails;
float cellH;
int cellCount;
UITapGestureRecognizer*singleRecognizer;
*//另外一种情况 在外部可以使用->调用*
@private 私有
NSString private;
@protected 默认
NSString protected;
@public 公开
NSString public;
@package 一般很少用(对于framework内部相当于protected 对于framework外部相当于private)
NSString package;
}
//实例变量(属性)
@property (strong, nonatomic) NSString * productCode;
@property (strong, nonatomic) NSString * productName;
@property (strong, nonatomic) NSString * sellOrderNo;
@end
**//位于m实现文件中的变量(deafult @private)**
@interface RegularDetailViewController ()
{
ProductDetails *myProductDetails;
float cellH;
int cellCount;
}
@property (strong, nonatomic) UITableView *myTableView;
@property (strong, nonatomic) UILabel *labelShow;
@property (strong, nonatomic) UIView *buyView;
@property (strong, nonatomic) UIButton *buyBtn;
@property (strong, nonatomic) BaseWebViewController *baseWeb;
@end
@implementation RegularDetailViewController
- (void)viewDidLoad {
//调用例子
CurrentDetailViewController *currentDetailViewController = [[CurrentDetailViewController alloc]init];
CurrentDetailViewController ->public = @"";
CurrentDetailViewController ->private = @"";
CurrentDetailViewController ->protected = @"";
CurrentDetailViewController ->package = @"";
}
@end
2,Instance varialbes OC里边的属性 其实就是实例变量。属性默认只能是对象形式存在。像 int count; 就是一个成员变量。 而 NSString * name; 是一个实例变量。通俗点就是基本数据类型和构造类型不能被称之为实例变量。
至于 id date/data 应该属于成员变量还是实例变量呢? 因为 id 是 OC特有的泛型指针类型。从本质上讲, id 等同于 (void *)。
所以 id date/data 应属于 实例变量。
需要注意的是
成员变量,有四种权限,就是大家都知道的@private、@protected、@public 、@package 写在.m文件中时,相当于是@private权限,子类无法访问。
而写在.h文件中,默认是@protected权限,子类可以访问,可以做权限修改。
因为访问权限指针指向.h文件。.h文件中成员变量,外部实例对象对其的调用,跟C++一样,用->来调用。
有理解不到位的地方欢迎大家指出!!!