Ios NSString类别中的扩展属性崩溃

Ios NSString类别中的扩展属性崩溃,ios,objective-c,iphone,nsstring,Ios,Objective C,Iphone,Nsstring,我刚刚在类别类中为NSString类创建了一个扩展 #import "NSString+Name.h" @interface NSString(Name) @property (nonatomic, retain) NSString *var; @end 但是当我试图访问category类中的私有变量时,应用程序崩溃并给出错误 @implementation NSString (Name) - (NSString*)newString{ [self setVar:@"Its

我刚刚在
类别
类中为
NSString
类创建了一个
扩展

#import "NSString+Name.h"

@interface NSString(Name)

@property (nonatomic, retain) NSString *var;

@end
但是当我试图访问category类中的私有变量时,应用程序崩溃并给出错误

@implementation NSString (Name)

- (NSString*)newString{

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

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

    return self.var;
}

@end
撞车原因

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


如果我能够在那个变量中赋值,那么为什么它会说unrecognized selector

use_uu而不是self呢?它会进入无限循环

- (NSString*)newString
{

    _var = @"Its a new string";
    NSLog(@"name = %@",_var);

    return (self.var);
}

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

h

m


请参阅,并且

您尝试执行的操作存在一些问题

  • 不能按常规将属性添加到类别中
  • 来自苹果的[目标C编程][1]文档:

    类别可用于声明实例方法或类方法,但通常不适合声明其他属性

    类别可以添加称为关联对象的内容,但其主要目的是添加方法

  • 类别实例方法中的Self引用实例变量
  • 类别实例方法(以-)开头的方法对调用该方法的实例变量进行操作。在实例方法中,self引用调用方实例变量,而不是类(或您试图访问的类别属性)

    在您的类别示例中,您将从现有NSString调用newString,如下所示:

    NSString *myString = @"foo";
    [myString newString];
    
    换句话说,newString类别扩展对调用它的字符串进行操作。您可以更改该字符串,或返回不同的结果,但问题是您正在对没有此类
    var
    属性或方法的NSString进行操作

    这就是为什么您会看到“没有这样的选择器消息”,因为NSString对您碰巧添加到类别中的不相关属性一无所知

  • 以新开始的方法对ARC有特定的意义

  • 另一个问题是,您已经用“new”开始了该方法。Objective-C有一些特定的命名约定与内存管理策略有关。使用alloc、new、copy或mutableCopy启动方法会隐式地告诉ARC您的方法(已创建并)正在返回保留的对象。您的
    newString
    方法未创建对象。

    您是否尝试使用
    [self-setvar:@“Its a new string”]
    正如@Ghanshyam在他的回答中提到的,您必须访问_var=@“这是一个新字符串”;这将设置新字符串successfully@Kamarshad我无法访问_var它只允许我访问self.varString不会初始化,因此您无法为它分配任何值。它已初始化,这就是我能够调用newString方法的原因。我无法访问_var它只允许我访问self.var或[self var]在.h中公开定义在.m中声明是否有某种用途?这是在Apple create类中添加变量的最佳方法,供将来的读者使用,键(“SomeKey”)的值并不重要,因为您只是使用键的地址,因此我只使用
    static void*const kaSociatedStorageKey=(void*)&KaSociatedStorageKey
    
    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);
    }
    
    NSString *myString = @"foo";
    [myString newString];