注:属性和接口的方法一致,以接口为例
开放接口:
OC的文件分为.h和.m两种,.h文件,也就是头文件,这里有个
@interface test : NSObject
-(void)test;
@end
这里面声明的所有方法在该项目里的test对象都可以调用,也就是public的意思,但是不同的项目如果也想呢。也就是framework开放出去。也很简单。把你想开放出去的接口文件扔这里,如果有人引用了你的framework,那么该文件就可以被他引用。需要注意的是,该文件里的所有接口都会被开放出去。
隐藏接口
隐藏接口有两种方式
1.把你写的方法写在.m文件中。也就是不写方法的声明,这里面的方法就是外面不可调用的,也就是private的方法。但是同样的,工程内的其他类中的对象,也无法调用该接口
2.和开放接口一样,把方法的声明写在.h文件,但是相关文件不放在public中。这样就是本工程/包内部可用,但是包外部不可用。
隐藏和开发部分接口
开发的时候经常会遇到一个问题,就是我有的类,包内和包外都是需要使用的,但是该类有的方法包内可用,包外有不可用。也就是实现一个public类中既有包外可见的方法,又要有仅包内可见的方法。那么所有声明放在.h中,放在public,就是不对的,因为不想可见的方法也会被可见。但不放public中,包外又不可见所有的方法了,如果方法不在.h中声明,包内该方法也不可见了。
那么可以用扩展来完成该操作。也就是说,新创建一个文件
注意,这里选extension,class选你需要扩展的类。需要注意的是,这里生成的新的文件,叫做:”类名+你起的file名",而不是单纯的“file名"
这会生成一个新的类,该类的功能就是扩展你的头文件,也就是说,你的.m文件对应了两个.h文件。这两个.h文件对于点m是等价的。而且扩展中的所有方法,是需要再.m中实现的。
这样的话,你原本的那个.h文件就可以放你希望公开的接口,然后放在public中。不想对包外公开,又想对包内公开的接口放在新生成的扩展文件中,再把文件放在private中,就实现某个类的部分接口可见。部分接口不可见。
补充
OC有一个关键字,叫 @package 这个其实就是一个包内可见,包外不可见的关键字,被@package 修饰的类成员变量,就可以实现上面的功能,需要注意的是,@package 只能修饰类成员变量,不可修饰属性和方法。
用法如下
@interface test : NSObject
{
@package NSString *log; //语法正确
}
@package @property(nonatomic,readonly) NSString *log; //语法错误
@package
-(void)test; //语法错误
@end
再补充一个
有的属性,你希望对外只读,对类内是读写的。也就是说,该类.m内是可以修改改值的,其他的类生成的该类对象都是不可修改。可以这么实现
//.h文件中
@interface test : NSObject
@property(nonatomic,readonly) NSString *log;
@end
//.m文件中
@interface test()
@property(nonatomic,readwrite) NSString *log;
@end
需要注意的是,变量名和类型要一致,不同的话就是两个不同的变量了。也就是说,@property()内的每个参数都可以修改,让类外和类内的同一个属性权限不一致