ios – 扩展属性在NSString类别中崩溃

ios – 扩展属性在NSString类别中崩溃,第1张

概述我刚刚在Category类中创建了一个NSString类的扩展 #import "NSString+Name.h"@interface NSString(Name)@property (nonatomic, retain) NSString *var;@end 但是当我试图访问类别类中的私有变量时,应用程序崩溃并给出错误. @implementation NSString (Name) 我刚刚在category类中创建了一个Nsstring类的扩展

#import "Nsstring+name.h"@interface Nsstring(name)@property (nonatomic,retain) Nsstring *var;@end

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

@implementation Nsstring (name)- (Nsstring*)newString{    [self setvar:@"Its a new string"];    // Crashes here    NSLog(@"name = %@",self.var);    return self.var;}@end

崩溃的原因

unrecognized selector sent to instance 0x1023641c8 2015-05-25
11:12:49.246 Tute[710:14433] *** Terminating app due to uncaught
exception ‘NSinvalidargumentexception’,reason:
‘-[__NSCFConstantString setvar:]: unrecognized selector sent to
instance 0x1023641c8’

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

解决方法 你要做的事情有一些问题.

>您不能按常规方式向属性添加属性.

来自Apple的[使用Objective C编程] [1]文档:

CategorIEs can be used to declare either instance methods or class methods but are not usually suitable for declaring additional propertIEs.

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

>类别实例方法中的Self指的是实例变量

类别实例方法(以 – 开头的方法)对调用该方法的实例变量进行 *** 作.在实例方法中,self指的是调用者实例变量,而不是您尝试访问的类(或类别属性).

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

Nsstring *myString = @"foo";[myString newString];

换句话说,newString类别扩展对调用它的字符串进行 *** 作.您可以更改该字符串,或返回不同的结果,但问题是您正在使用没有此类var属性或方法的Nsstring.

这就是为什么你会看到’没有这样的选择器消息’,因为Nsstring对你碰巧添加到你的类别中的无关属性一无所知.

>以new开头的方法对ARC具有特定含义.

另一个问题是,你已经用’new’开始了这个方法. Objective-C有一些与内存管理策略有关的特定命名约定.使用alloc,new,copy或mutablecopy启动方法会隐式告诉ARC您的方法(已创建和)正在返回一个保留对象.您的newString方法没有创建对象.

总结

以上是内存溢出为你收集整理的ios – 扩展属性在NSString类别中崩溃全部内容,希望文章能够帮你解决ios – 扩展属性在NSString类别中崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存