Category & Extension

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值