NSString类别中的扩展属性崩溃

abh*_*war 4 iphone objective-c nsstring ios

我刚刚在一个班级内创建了一个Extensionfor 班级NSStringCategory

#import "NSString+Name.h"

@interface NSString(Name)

@property (nonatomic, retain) NSString *var;

@end
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试访问类别类中的私有变量时,应用程序崩溃并给出错误。

@implementation NSString (Name)

- (NSString*)newString{

    [self setVar:@"Its a new string"];    // Crashes here

    NSLog(@"name = %@",self.var);

    return self.var;
}

@end
Run Code Online (Sandbox Code Playgroud)

撞车原因

无法识别的选择器发送到实例0x1023641c8 2015-05-25 11:12:49.246 Tute [710:14433] ***由于未捕获的异常'NSInvalidArgumentException'终止了应用程序,原因:'-[__ NSCFConstantString setVar:]:无法识别的选择器发送到实例0x1023641c8'

如果我能够在该变量中分配值,那么为什么说不识别的选择器

Viv*_*kar 5

您应该使用关联对象。在下面找到对我有用的代码:

。H

@interface NSString (Name)

@property (nonatomic, assign)NSString *var;
- (NSString*)newString;
@end
Run Code Online (Sandbox Code Playgroud)

.m

static char const * const Key = "SomeKey";

@implementation NSString (Name)

- (NSString*)newString
{
    self.var = @"Its a new string";
    NSLog(@"name = %@",self.var);

    return (self.var);
}

- (void)setVar:(NSString *)aVar {
    objc_setAssociatedObject(self, Key, aVar, OBJC_ASSOCIATION_ASSIGN);
}

- (NSString*)var {
    return (NSString*)objc_getAssociatedObject(self, Key);
}
Run Code Online (Sandbox Code Playgroud)

请参阅这里这里这里