ios appendstring怎么用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios appendstring怎么用相关的知识,希望对你有一定的参考价值。
参考技术A 大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢?比如:
@property (retain,nonatomic) NSString *rStr;
@property (copy, nonatomic) NSString *cStr;
- (void)test:
NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
self.rStr = mStr;
self.cStr = mStr;
NSLog(@"mStr:%p,%p", mStr,&mStr);
NSLog(@"retainStr:%p,%p", _rStr, &_rStr);
NSLog(@"copyStr:%p,%p", _cStr, &_cStr);
}
假如,mStr对象的地址为0x11,也就是0x11是@“abc”的首地址,mStr变量自身在内存中的地址为0x123;
当把mStr赋值给retain的rStr时,rStr对象的地址为0x11,rStr变量自身在内存中的地址为0x124;rStr与mStr指向同样的地址,他们指向的是同一个对象@“abc”,这个对象的地址为0x11,所以他们的值是一样的。
当把mStr赋值给copy的cStr时,cStr对象的地址为0x22,cStr变量自身在内存中的地址0x125;cStr与mStr指向的地址是不一样的,他们指向的是不同的对象,所以copy是深复制,一个新的对象,这个对象的地址为0x22,值为@“abc”。 参考技术B -appendString: and -appendFormat: //把一个字符串接在另一个字符串的末尾
NSMutableString *String1 = [[NSMutableString alloc] initWithString:@"This is a NSMutableString"];
[String1 appendString:@", I will be adding some character"];
[String1 appendFormat:[NSString stringWithFormat:@", I will be adding some character"]];
NSLog(@"String1:%@",String1);
NSMutableString appendString 生成一个 SIGABRT
【中文标题】NSMutableString appendString 生成一个 SIGABRT【英文标题】:NSMutableString appendString generates a SIGABRT 【发布时间】:2010-09-10 16:17:54 【问题描述】:这对我来说毫无意义。也许这里有人可以解释为什么会发生这种情况。
我有一个 NSMutableString,我分配在我的 iPhone 应用程序的顶部,然后在该过程的稍后部分附加。它会导致一个 SIGABRT,这对我来说并不重要。代码如下:
头文件(简体):
@interface MyAppDelegate : NSObject <UIApplicationDelegate>
UIWindow *window;
NSMutableString *locationErrorMessage;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, copy) NSMutableString *locationErrorMessage;
@end
以及Main的相关部分:
@implementation MyAppDelegate
@synthesize window;
@synthesize locationErrorMessage;
- (void)applicationDidFinishLaunching:(UIApplication *)application
self.locationErrorMessage = [[NSMutableString alloc] init];
- (void)anotherFunction
[self.locationErrorMessage appendString: @"Blah Blah Blah"];
这一切看起来都很简单。我错过了什么?
【问题讨论】:
肯定还有一些其他相关的代码你没有显示...也许发布崩溃日志,它可能会有所帮助 【参考方案1】:我会将此称为属性设置器生成方式的错误,但答案很简单:
您将该属性声明为(nonatomic, copy)
。这意味着无论何时设置 locationErrorMessage
属性,它都会在新值上调用 copy
并将该副本用作属性值。
不幸的是,在NSMutableString
上调用copy
不会产生NSMutableString
,它会产生NSString
(不能使用appendString:
之类的东西对其进行变异)。
因此,简单的解决方法是将属性声明从 copy
更改为 retain
。
(我会说错误是:如果您将可变对象的属性声明为copy
,那么复制设置器实际上应该使用mutableCopy
而不是copy
)=> rdar://8416047
【讨论】:
【参考方案2】:您的属性正在复制传入的字符串。副本始终是不可变的,因此您尝试将appendString:
发送到不可变的NSString
。将您的属性声明为retain
,它将工作或编写一个自定义设置器,使用mutableCopy
复制字符串。
你也有内存泄漏,你应该使用[NSMutableString string]
而不是alloc-init
序列。
【讨论】:
【参考方案3】:顺便说一句,你那里有泄漏,
self.locationErrorMessage = [[NSMutableString alloc] init];
您正在复制该值,但您从未释放实际第一个分配的 NSMutableString。
【讨论】:
以上是关于ios appendstring怎么用的主要内容,如果未能解决你的问题,请参考以下文章
NSMutableString appendString 生成 SIGABRT 错误
NSMutableString appendString 生成一个 SIGABRT
__NSCFString appendString: Cocoa 中 NSMutableString 崩溃
求教,Java的StringBuilder里的append()方法要怎么用?括号里面要怎么填eclipse才不出现错误
Jquery怎么选择用append添加的元素。我用append添加了一个a标签,添加后用$("a")选择不了。在线等,急。