NSString+NewCategory.h
#import <Foundation/Foundation.h>
@interface NSString (NewCategory)
-(void) showNewCategory;
@end
main.m
#import <Foundation/Foundation.h>
#import "NSString+NewCategory.h"
/*
1.category-和swift中的extension一样。
category对于定义放的位置有严格的规定,元类名+Category名.h
如下面的扩展NSString (NewCategory),必须放在头文件NSString+NewCategory.h中声明
并且任何想使用这个扩展的文件中必须包含此头文件
该扩展可以用于所有的NSString并且适用于其子类。
2.✨✨由于扩展必须包含指定的头文件才有效,利用这个特性可以给相同的扩展实现不同的属性
只需要将这些扩展放置到不同的文件中就可以了,用户需要用哪个扩展,就包含哪个头文件即可。
3.注意,如果搞了重名的函数,则会出现问题。所以要考虑命名方法,尽量不要重复。
4.category只能扩展函数,不能扩展属性。
5.如果自己有类的源代码,可以进行编译,可以通过extension来扩展属性。extension和category的语法
类似,只是括号中没有category名字,所以也被成为匿名category。扩展写在自己的类定义中即可。
由于interface常被用作外部的公开接口,所以不能暴漏太多内容。而类扩展常常用来扩展一些自己类内部使用
的功能,比如interface中只读的属性,可以在扩展为类内部可写的。
6.有没有比扩展更好的方法?
尽量用子类或者代理来做这些动作,减少扩展和category。
*/
@implementation NSString (NewCategory)
-(void) showNewCategory
{
NSLog(@"This is new extension for NSString!");
}
@end
int main()
{
NSString *s = [[NSString alloc] init];
[s showNewCategory]; //这里会执行对NSString中的扩展。
return 0;
}
/* 类扩展 */
//原始的类
@interface XYZPerson : NSObject
//readonly的变量,不会自动生成setter,不能通过self.var来修改,但是可以通过_varname来修改
//readonly的变量也不能通过[person readonlyVar] = xx, person.var = xxx来赋值。
@property (readonly) NSString *uniqueIdentifier;
- (void)assignUniqueIdentifier;
@end
//在类的外部,其他对象调用的时候,只能通过assignUniqueIdentifier函数修改
//不能通过class.var形式修改,那么可以进行扩展如下,readwrite是可选的,因为默认为只读的。
//在implementation的文件中添加如下扩展后,自己类的内部就可以直接进行赋值操作了。
@interface XYZPerson ()
@property (readwrite) NSString *uniqueIdentifier;
@end