zoukankan      html  css  js  c++  java
  • 继承NSString,NSArray 怎么写

    今天在进行一个字符串测试的时候,自定义了一个继承自NSString的类,但是出现了一些问题,查阅官方文档后得到了下面这些结论

    在Objective-C中,对于NSString、NSArray等一些系统的基础类,苹果公司不推荐继承创建新类的,要想给它们扩展功能只能给它们添加新的categroy(类目)。
    但是直接继承的话,也是可行的,只是会出现各种问题
    
    
    
    以NSString为例
    
    首先,创建一个NSString的子类 BFString,不添加任何方法和属性
    直接创建一个BFString的实例对象,是没有问题的
    
    BFString *str = [[BFString alloc]init];
    
    但是如果使用其他初始化方法,比如
    
     BFString *str = [BFString stringWithFormat:@"test"];

    运行结果:

    查看官方文档后:
    
    要为string中的字符提供存储机制,这些存储机制可以是静态数组、动态分配的缓存、NSString的对象或者是其他数据类型。
    
    首先是需要为子类的字符串提供存储机制,其次还要实现两个方法
    
    
    @interface BFString : NSString
    {
        NSString *_backingStore;
    }
    @end
    
    然后在实现方法中,覆写以上两个方法length和characterAtIndex:,当然也要覆写一下初始化方法
    
    @implementation BFString
    
    - (id)initWithString:(NSString *)aString
    {
        if (self = [self init]) {
            _backingStore = [[NSString stringWithString:aString] copy];
        }
        return self;
    }
    
    - (NSUInteger)length
    {
        return [_backingStore length];
    }
    - (unichar)characterAtIndex:(NSUInteger)index
    {
        return [_backingStore characterAtIndex:index];
    }
    
    @end
    
    
    将字符串存储在_backingStore之中,然后通过读取该字符串来获得子类字符串的长度和字符
    现在,继承NSString的这个子类就没有问题了。
    这个做法同样适用于NSArray、NSDictionary、NSNumber等
  • 相关阅读:
    【转】P2P通信原理与实现(C++)
    【转】P2P通信标准协议(二)之TURN
    【转】P2P之UDP穿透NAT的原理与实现
    【转】P2P的原理和常见的实现方式
    【转】linux中man使用技巧
    【转】go编译时,加入svn版本信息
    各种移动GPU压缩纹理的使用方法
    Unity贴图压缩格式设置
    关于U3D贴图格式压缩
    可能会导致.NET内存泄露的8种行为
  • 原文地址:https://www.cnblogs.com/zhubaofeng/p/5256291.html
Copyright © 2011-2022 走看看