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 selectoruse_uu而不是self呢?它会进入无限循环
- (NSString*)newString
{
_var = @"Its a new string";
NSLog(@"name = %@",_var);
return (self.var);
}
您应该使用关联的对象。请在下面找到适合我的代码: h m
请参阅,并且您尝试执行的操作存在一些问题
NSString *myString = @"foo";
[myString newString];
换句话说,newString类别扩展对调用它的字符串进行操作。您可以更改该字符串,或返回不同的结果,但问题是您正在对没有此类var
属性或方法的NSString进行操作
这就是为什么您会看到“没有这样的选择器消息”,因为NSString对您碰巧添加到类别中的不相关属性一无所知
另一个问题是,您已经用“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];