天道酬勤,学无止境

Objective C NSString problem

I have a NSString that I need to examine character by character and:

 examine char
    perform calculation
 loop (until string ends)

Any thoughts on the best way to do this? Do I need to convert the NSString to a NSArray or C string?

评论

The simplest way to go about it is using NSString's characterAtIndex: method:

int charIndex;
for (charIndex = 0; charIndex < [myString length]; charIndex++)
{
    unichar testChar = [myString characterAtIndex:charIndex];
    //... your code here
}

-characterAtIndex: is the simplest approach, but the best is to drop down to CFString and use a CFStringInlineBuffer, as in this method:

- (NSIndexSet *) indicesOfCharactersInSet: (NSCharacterSet *) charset
{
    if ( self.length == 0 )
    return ( nil );

    NSMutableIndexSet * set = [NSMutableIndexSet indexSet];

    CFIndex i = 0;
    UniChar character = 0;
    CFStringInlineBuffer buf;
    CFStringInitInlineBuffer( (CFStringRef)self, &buf, CFRangeMake(0, self.length) );

    while ( (character = CFStringGetCharacterFromInlineBuffer(&buf, i)) != 0 )
    {
        if ( [charset characterIsMember: character] )
            [set addIndex: i];

        i++;
    }

    return ( set );
}

This is better because it will grab a number of characters at once, fetching more as required. It's effectively the string-character version of for ( id x in y ) in ObjC 2.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 从文本文件读取-目标C(Reading from text file - Objective C)
    问题 我试图使自己熟悉目标C,而我当前的目标是读取文本文件中的项目列表并将其存储在NSString数组中。 目前,这是我所拥有的: NSString *filepath = [[NSBundle mainBundle] pathForResource:@"myList" ofType:@"txt"]; NSData* data = [NSData dataWithContentsOfFile:filepath]; NSString* string = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; NSString* delimiter = @"\n"; listArray = [string componentsSeparatedByString:delimiter]; 我不确定这是否重要,但是myList.txt在我的支持文件中。 目前,我的清单中只有一项。 但是,我什至无法将那一项存储到我的listArray 。 我敢肯定,我很想念这是很愚蠢的,我对Objective C还是陌生的。 编辑:我为未提及此事而道歉。 我没有收到任何错误。 我的数组只是空的。 回答1 我将建议您进行一些简化,以解决您的问题,因为我无法说出您的问题是什么
  • C 指针与 Objective-C 指针(C pointers vs. Objective-C pointers)
    问题 我来自 Objective-C 背景,并试图扩展我在 C 方面的知识。然而,有一件事让我感到困惑,那就是 C 中的指针和 Obj-C 中的指针之间的区别。 正如您在下面的示例中所看到的,两种语言之间的行为似乎有些不同,我想知道您是否可以帮助解释原因? C 代码工作正常: void myFunction() { int x, *pointerX; pointerX = &x; *pointerX = 5; // Prints: "x is 5" printf("x is: %i", x); } Obj-C 代码失败: - (void)myMethod { NSString *string = @"Caramel coffee", *stringPointer; stringPointer = &string; // Warning: Assignemnt from incompatible pointer type *stringPointer = @"Chocolate milkshake"; // Exception: Incompatible types in assignment NSLog(@"string is: %@", string); } 问题:为什么我不能将 stringPointer 分配给字符串的内存地址( stringPointer = &string
  • CamelCase 下划线并返回到 Objective-C(CamelCase to underscores and back in Objective-C)
    问题 我正在寻找一种简单、有效的方法将 CamelCase 中的字符串转换为下划线符号(即 MyClassName -> my_class_name),然后在 Objective C 中再次返回。 我当前的解决方案涉及 NSMutableStrings 上的大量rangeOfString 、 characterAtIndex和replaceCharactersInRange操作,而且简直丑得要命:) 似乎必须有更好的解决方案,但我不确定它是什么。 我宁愿不只为这个用例导入正则表达式库,但如果所有其他方法都失败了,这是一个选项。 回答1 Chris 对 RegexKitLite 的建议很好。 这是一个出色的工具包,但使用 NSScanner 可以很容易地完成。 使用-scanCharactersFromSet:intoString:在+uppercaseLetterCharacterSet和+lowercaseLetterCharacterSet之间交替。 返回时,您将使用-scanUpToCharactersFromSet:来代替,而是使用其中只有一个下划线的字符集。 回答2 这些怎么样: NSString *MyCamelCaseToUnderscores(NSString *input) { NSMutableString *output = [NSMutableString
  • (不是)使用属性时出现傻傻的Objective-C继承问题-GCC错误?((Not So) Silly Objective-C inheritance problem when using property - GCC Bug?)
    问题 更新-许多人坚持要求我为该物业申报iVar。 有人说不是,因为我正在使用现代运行时(64位)。 我可以确认,我已经成功使用不带iVars的@property已有几个月了。 因此,我认为“正确”的答案解释了为什么在64位上我突然必须(仅当)要从子类访问iVar时显式声明iVar。 到目前为止,我所看到的唯一一个可能是GCC错误(感谢Yuji)。 毕竟不是那么简单...要弄清楚可能的错误是:从基类继承时,如果子项也恰巧在访问iVar之前使用@synthesize实现了未关联的访问器,则该子项无法访问父项的iVar。 我已经花了几个小时来摸索-我没有太多使用继承。 在这里,我建立了一个简单的Test B类,该类继承自Test A,其中声明了ivar。 但是我收到未声明变量的编译错误。 仅当我添加属性和synthesize声明时才会发生这种情况-如果没有它们,则可以正常工作。 TestA标头: #import <Cocoa/Cocoa.h> @interface TestA : NSObject { NSString *testString; } @end TestA实现为空: #import "TestA.h" @implementation TestA @end TestB标头: #import <Cocoa/Cocoa.h> #import "TestA.h"
  • 通过类别覆盖Objective c中的方法(Override a method in Objective c via category)
    问题 以下是在目标c中的工作: // Base Class in ClassA.h and ClassA.m @interface ClassA : NSObject - (NSString *) myMethod; @end @implementation ClassA - (NSString*) myMethod { return @"A"; } @end //Category in ClassA+CategoryB.h and ClassA+CategoryB.m @interface ClassA (CategoryB) - (NSString *) myMethod; @end @implementation ClassA (CategoryB) - (NSString*) myMethod { return @"B"; } @end 问题是,如果我只是导入ClassA.h并发送消息 [myClassA myMethod]; //returns B 为什么返回B ? 我没有导入ClassA + CategoryB 如果我做了以下事情,即使是futhrer: // Base Class in ClassA.h and ClassA.m @interface ClassA : NSObject - (NSString *) myMethod; - (NSString *)
  • Objective C: How to upload image and text using HTTP POST?
    I've successfully created two different methods where each of them can upload either an image or text. But I am having problem writing a method that can post both text and image simultaneously! // Here's my new method witch worked fine thanx to @sgosha: - (void) upload { NSString *urlString = @"http://www.examplescript.com"; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; NSString *boundary = [NSString stringWithString:@"---------------
  • How to post string with special character and Thai Language using XML parsing in Objective C?
    I am new in iOS and I am facing problem regarding to post string containing special character. My code is like this in DidFinishLoading: NSXMLParser *myNSXMLParserPostObj=[[NSXMLParser alloc]initWithData:myNSMDataPostFromServer]; myNSXMLParserPostObj.delegate=self; [myNSXMLParserPostObj parse]; NSLog(@"%@",myNSXMLParserPostObj.parserError); NSString *responseStringWithEncoded = [[NSString alloc] initWithData: myNSMDataPostFromServer encoding:NSUTF8StringEncoding]; //NSLog(@"Response from Server : %@", responseStringWithEncoded); NSAttributedString * attrStr = [[NSAttributedString alloc]
  • 从Objective-C调用C ++(Calling C++ from Objective-C)
    问题 对于那些已经能够成功从Objective-C调用C ++代码的人,请给我启发? 该链接说,您需要使用他在文章中介绍的技术来包装C ++代码。 看起来不错,但我仍然有问题。 该链接表示,只要将调用C ++类的Objective-C类转换为.mm(Objective-C ++)类,那么这两个类就可以很好地协同工作。 这些方法中的每一种都使我在尝试添加方法调用的那一刻感到悲伤。 有人可以给我提供一个简单的Hello World iOS应用程序的代码,该应用程序将Objective-C用于“ Hello”部分,将C ++类用于“ World”部分,中间使用一个Objective-C ++类吗? 还是我仍然对整个概念有误? 回答1 本质上,您需要一个扩展名为.mm的ObjC类,并调用一个扩展名为.mm的ObjC类。 第二个将用作C ++包装器类。 包装器类将调用您的实际.cpp类。 这有点棘手,所以我将给您一些冗长的代码。 这是项目的概述: 在您的ObjC代码(ViewController)中,您将调用CplusplusMMClass - (IBAction)buttonPushed:(UIButton *)sender { self.mmclass = [[CplusplusMMClass alloc]init]; // bad practice; but showing code
  • 将iOS目标C对象转换为JSON字符串(Convert an iOS objective c object to a JSON string)
    问题 我有一个客观的C类, @interface message : NSObject { NSString *from; NSString *date; NSString *msg; } 我有此消息类的实例的NSMutableArray。 我想使用iOS 5 SDK中的新JSONSerialization API将NSMutableArray中的所有实例序列化为JSON文件。 我怎样才能做到这一点 ? 是否通过遍历NSArray中元素的每个实例来创建每个键的NSDictionary? 有人可以提供有关如何解决此问题的代码的帮助吗? 我无法在Google中获得良好的结果,因为“ JSON”将结果偏向服务器端调用和数据传输而不是序列化。 非常感谢。 编辑: NSError *writeError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"JSON
  • 在目标C中使用extern(Use of extern in Objective C)
    问题 在目标C中使用extern有多好? 它确实使某些部分的编码变得容易..但是,它不会破坏对象的方向吗? 回答1 您会发现extern在Cocoa框架中得到了广泛使用,并且很难找到令人信服的论点,即他们的OO被“破坏”了。 相反,可可被很好地封装,仅通过外部将其必须暴露的东西暴露出来。 全局定义的常数无疑是最常见的用法,但不一定是唯一的有效用法。 IMO,使用extern不一定会“破坏”面向对象。 即使在OO中,也经常使用可从任何地方访问的变量。 使用extern是在Objective-C中缺少“类变量”(如Java中用static声明的变量)的最常见解决方法。 它允许您扩展符号的引用范围,超出了声明符号的编译单元的范围,本质上是通过保证符号将在某处定义来进行引用。 您也可以将extern与__attribute__((visibility("hidden")))以创建可以在其编译单元外部使用但不能在其链接单元外部使用的符号。 我已将其用于自定义库和框架代码,以正确封装更高级别的内部细节。 回答2 在Objective-C中有一些extern关键字的用例。 Aaron Hillegass建议创建外部通知全局名称。 例如: extern NSString* const XYYourNotification; 然后,在实现中定义实际的NSString* 回答3 这取决于您使用它的目的
  • 如何在Objective C中使用XML解析发布具有特殊字符和泰语的字符串?(How to post string with special character and Thai Language using XML parsing in Objective C?)
    问题 我是iOS的新手,我面临有关发布包含特殊字符的字符串的问题。 我的代码在DidFinishLoading中是这样的: NSXMLParser *myNSXMLParserPostObj=[[NSXMLParser alloc]initWithData:myNSMDataPostFromServer]; myNSXMLParserPostObj.delegate=self; [myNSXMLParserPostObj parse]; NSLog(@"%@",myNSXMLParserPostObj.parserError); NSString *responseStringWithEncoded = [[NSString alloc] initWithData: myNSMDataPostFromServer encoding:NSUTF8StringEncoding]; //NSLog(@"Response from Server : %@", responseStringWithEncoded); NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[responseStringWithEncoded dataUsingEncoding:NSUnicodeStringEncoding
  • 在Objective-C中获取对象属性列表(Get an object properties list in Objective-C)
    问题 如何在Objective-C中获得给定对象属性的列表(以NSArray或NSDictionary的形式)? 设想以下情形:我定义了一个父类,该类仅扩展了NSObject ,该类包含一个NSString ,一个BOOL和一个NSData对象作为属性。 然后,我有几个扩展该父类的类,每个类都添加了许多不同的属性。 我有什么办法可以在遍历整个对象的父类上实现一个实例方法,并且将每个(子)类属性的NSArray作为不在父类上的NSStrings ,因此我以后将这些NSString用于KVC? 回答1 我只是设法自己得到答案。 通过使用Obj-C运行时库,我可以按自己的方式访问属性: - (void)myMethod { unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([self class], &outCount); for(i = 0; i < outCount; i++) { objc_property_t property = properties[i]; const char *propName = property_getName(property); if(propName) { const char *propType = getPropertyType
  • 从 C 到 Objective-C 的回调方法(Callback methods from C to Objective-C)
    问题 我有一个 Objective-C 类。 我正在做的是在我的 Objective-C 类中调用 C 函数 [我在一个文件中实现的 C 函数,它是这个示例 ios 项目的一部分]。 所有 C 函数都工作正常,到目前为止没有问题。 当我尝试在 C 文件中调用异步函数时,该函数将在一段时间后响应 Objective-c 类。 我在 C 中调用了函数指针,它在 Objective-C 类中正确触发。 请检查以下代码片段。 我想对回调方法做一些 UI 相关的操作。 那可能吗 ? 如果没有还有其他方法吗? 你能不能尽快给我答复。 谢谢。 C文件: void my_int_func(int x); void test_asyn_fun () { /* This code is for Sleep logic */ for (int i=0; i<50000; i++) { // sleep } /* Sleep End */ void (*foo)(int); foo = &my_int_func; foo(25); } Objective-C 文件: void my_int_func(int x) // this is call back method { printf( "%d\n", x ); // working properly [self anyMethodInMyClass]
  • Objective-C 是否有等价于 java 的注解?(Does Objective-C have an equivalent to java annotations?)
    问题 Objective-C 是否有等价于 java 的注解? 我想要做的是创建一个属性并能够以某种方式访问​​有关它的一些元数据。 我希望能够确定我的数组中应该包含什么类型的类,所以我想以某种方式对其进行注释以这样说。 然后可以通过诸如运行时库之类的东西访问该注释,我可以在其中访问属性列表及其名称。 //Put some sort of annotation giving a class name. @property (strong) NSArray *myArray; 回答1 你说: 我希望能够确定我的数组中应该包含什么类型的类,所以我想以某种方式对其进行注释以这样说。 然后可以通过诸如运行时库之类的东西访问该注释,我可以在其中访问属性列表及其名称。 在 Objective-C 中有几种方法可以做这种事情。 Apple 的框架通过添加一个返回所需信息的类方法来完成这类事情。 示例:KVO 中的依赖键、+[CALayer needsDisplayForKey:] 和相关方法。 因此,让我们创建一个类方法,该方法根据属性名称返回可以进入容器属性的类数组。 首先,我们将向NSObject添加一个类别以实现该方法的通用版本: @interface NSObject (allowedClassesForContainerProperty) + (NSArray *
  • Sqlite Database Insert Statement in Objective C
    I try to insert only two integer variable to my sqlite database. I created a database which name is ups.sqlite, it has a one table (upssTable) and the table have two column. But when I open /Users/ds/Library/Application Support/iPhone Simulator/5.0/Applications/FCB4B455-4B7F-4C47-81B6-AC4121874596/SqliteDeneme.app/ups.sqlite there is no data in ups.sqlite. My code is here: - (IBAction)buttonClick:(id)sender { NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSString *dbPath = [self getDBPath]; BOOL success = [fileManager fileExistsAtPath:dbPath]; if(!success) {
  • __unsafe_unretained NSString结构变量(__unsafe_unretained NSString struct var)
    问题 我正在尝试创建一个结构,其中具有几个不同类型的变量。 几种类型是NSString,但是尝试执行此操作会导致错误 ARC forbids Objective-C objects in structs or unions 因此,在阅读完该错误后,我认为添加该错误是明智的 __unsafe_unretained 在NSString声明之前,但是我不知道这会带来什么后果,我快速浏览了一下,发现了这篇有关以下内容的差异的详细文章: __强的 __虚弱的 __unsafe_unretained 但是,对于NSString在结构中带有__unsafe_unretained的结构的问题,仍然有些含糊,希望有人可以告诉我发生了什么,以及我将来在内存和阻止任何泄漏方面需要考虑的问题。 任何帮助,将不胜感激。 回答1 假设在ARC下,您可以这样声明一个结构: typedef struct { __strong NSObject *someObject; int someInteger; } MyStruct; 然后,您可以编写如下代码: MyStruct *thing = malloc(sizeof(MyStruct)); 问题: malloc不会对它返回的内存进行零填充。 所以thing->someObject是一些随机值-不一定是NULL。 然后为它分配一个值,如下所示: thing-
  • 如何使用Objective C在SQLite中获取日期时间列(How get a datetime column in SQLite with Objective C)
    问题 如何使用Objective C在SQLite中获取日期时间列? 我有一个包含4个字段的表: pk , datetime , value1和value2 。 pk (主键), value1和value2是整数,因此我正在使用: int value1 = sqlite3_column_int(statement, 2); int value1 = sqlite3_column_int(statement, 3); 但是我应该在datetime使用什么呢? 回答1 在SQLite中,本身没有日期/时间列类型,因此最终以儒略历日期值(实际列)或字符串(文本列)表示日期。 SQLite在如何用字符串表示日期方面也非常特别,yyyy-MM-dd HH:mm:ss(仅)。 这些是我为使用Objective-C中的SQLite日期编写的一些方法。 这些方法在NSDate上的类别中实现。 确保检查出SQLite提供的使用儒略日期的功能。 我发现这些功能非常有用(http://www.sqlite.org/lang_datefunc.html)。 该代码示例中包含一个用于导出NSDate的julianDay的函数。 看起来这里也涵盖了这个主题。 在iPhone应用程序中将日期保留到SQLite3 + (NSDate *) dateWithSQLiteRepresentation:
  • 目标C-按值传递并按引用传递(Objective C - Pass by value and pass by reference)
    问题 首先,对这个简单的问题感到抱歉。 但是我需要了解正在发生的事情。 我认为输出应为upper case string 。 但这是UPPER CASE STRING 。 - (void)test { NSString *stringVar = @"UPPER CASE STRING"; [self changeString:stringVar]; NSLog(@"value after changed : %@", stringVar); } - (void)changeString:(NSString*)string { string = [string lowercaseString]; } 发生了什么事以及如何解决? 回答1 [string lowercaseString]调用创建一个新的NSString对象,您将该对象分配给本地变量string 。 这不会在changeString函数外部更改stringVar的值。 指针本身按值传递。 一种执行所需操作的方法是将指针传递给指针: -(void) test { NSString *stringVar = @"UPPER CASE STRING"; [self changeString:&stringVar]; NSLog(@"value after changed : %@", stringVar); } -(void)
  • 目标c中一次有多个异步请求(Multiple async requests at once in objective c)
    问题 我要同时从Web服务器下载多个图像,但问题是它们相互混淆。 dispatch_async(dispatch_get_global_queue(0,0), ^{ NSData * data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"website.com"]]; if (data == nil) return; dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = [UIImage imageWithData:data]; }); }); 我从以下代码获得此代码:从URL Objective C获取图像。 我该如何解决?? 还有什么办法可以加快下载速度? 回答1 您可以使用“ AsyncImageView”类文件来同步加载图像,并在图像加载时显示活动指示器 AsyncImageView是一个类文件,它将在其中为每个调用创建连接,并且在完成图像数据下载后,它将为imageview返回图像。 如果图像已经在缓存中,则仅返回图像而不创建连接。 您可以从以下链接下载“ AsyncImageView”类文件:-https://www.dropbox.com/s/peazwjvky9fsjd7/Archive.zip 在
  • Convert basic script to Objective C (money formatting)
    I've got this basic like script that I need to convert to objective c, it turns big units of money into shortened versions (ie: 1.2m, etc), I've got most of the conversion done, but the biggest problem I'm having is right at the end. The original basic code is: ; Basic Code Function ShortCash$(BigNumber) out$="" ; First, grab the length of the number L=Len(BigNumber) Letter$="" ;Next, Do a sweep of the values, and cut them down. If l<13 out$=(BigNumber/1000000000) ; For each figure, out remainder should be divided so that it leaves a 2 digit decimal number.. remainder=(BigNumber Mod 1000000000