1 摘要
本文利用一个简单的实例探索类的私有方法和私有变量的原理。
2 私有的定义
类的私有变量和方法,指的是只能被当前类调用的方法和只能被当前类<直接>访问的变量(个人理解,不一定对)。
3 实例代码
3.1 父类h代码
#import <Foundation/Foundation.h>
@interface Father : NSObject
{
@public
int _public;
@private
int _private;
@package
int _package;
}
@property(nonatomic)int property;
@end
3.2 父类m代码
#import "Father.h"
@implementation Father
- (void)print1
{
// 只能在这里访问,不能在子类和main函数中直接访问。
_private = 223;
NSLog(@"_package %d _public%d _private%d age%d", _package, _public, _private, _property);
}
@end
3.3 子类h代码
#import "Father.h"
@interface Child : Father
@end
3.4 子类m代码
#import "Child.h"
@implementation Child
- (void)print2
{
NSLog(@"_package %d _public%d age%d", _package, _public, self.property);
// 在ARC关闭的情况下,类的私有方法无效。
[self print1];
}
@end
3.5 main函数代码
#import "Foundation/Foundation.h"
#import "Child.h"
#import "Father.h"
int main()
{
Father *f = [[Father alloc]init];
Child *c = [[Child alloc]init];
f.property = 1;
f->_public =2;
// 好像@public和@package是一样的效果。
f->_package = 3;
[f print1];
// c.age = 12;
c->_package = 22;
c->_public = 33;
// c->_private = 44;
[c print2];
// ARC关闭,类的私有方法无效。
[c print1];
return 0;
}
4 重点 难点 注意点
- 私有变量和ARC无关
- 私有方法在开启ARC是无法被子类和在main函数中调用,编译出错。而在关闭ARC时,可以被子类和在main函数中调用,只是写代码的时候没有实时提示。
- @property定义的是私有变量,之所以该变量可以被子类方法,是通过非私有的getter方法间接访问的。
- 好像@package和@Public没区别。
5 疑问
- 为什么ARC会导致这样的现象?
6 待补充
- @Package和@public的区别。