Extension 是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现. (Category没有这个限制)
@interface MyClass() {
float value;
}
// 单独扩展出来.h文件 #import 到 .m 文件中, 要是 包含到 .h文件中 就找不到类了.
这种写法的类别叫 匿名类别, 又叫类扩展, 所谓的扩展, 其实就是为一个类添加额外的原来没有的变量, 方法或合成属性.
作用, 可以定义私有的变量和方法, 因为Extension 声明的变量和方法 不能被子类 继承.
Person.m
#import "Person.h"
@interface Person()
{
float _weight; //私有变量
}
- (void)run; //私有方法, 因为直接写在.m文件里了, 类扩展.
@end
@implementation Person
- (void)run
{
NSLog(@"person is running");
}
@end
//************************ stone ***
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.age = 18;
p.name = @"zhangsan";
NSLog(@"%@",p.name);
NSLog(@"%d",p.age);
}
return 0;
}
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
/** name */
@property (nonatomic,strong) NSString * name;
+(void)test;
@end
/**
* 写法1: 写在.h文件里 可以写property, 自动生成set get方法,
* 扩展一个run方法 , 必须在.m 文件中实现, 不然有警告.
*/
@interface Person()
@property (nonatomic,assign) int age;
- (void)run;
@end
Person.m
#import "Person.h"
#import "Person_extension.h"
/**
* 写法2: 写在.m文件里, property 自动生成 set,get方法, 只不过是私有变量,不能使包含.h文件的其他文件调用
* 声明的方法必须实现, 不然有警告.
*/
@interface Person()
/** name2 */
@property (nonatomic,strong) NSString * name2;
- (void)run2;
@end
@implementation Person
+(void)test{
}
-(void)run{
}
-(void)run2{
}
-(void)run3{
}
Person_extension.h
#import "Person.h"
/**
* 写法3: 创建之后先导入到.m文件中, 不然连 NSString都没提示, 得生敲, 蛋疼
* 增加属性, 可以写@property,包含此文件的.m文件中自动生成 set,get方法.不过是私有的,
*/
@interface Person ()
/** name3 */
@property (nonatomic,strong) NSString * name3;
- (void)run3;
@end