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")选择不了。在线等,急。

Java中log.append怎么用,啥意思