【问题标题】:NSString returns empty from a return methodNSString 从返回方法返回空
【发布时间】:2012-09-20 02:37:36
【问题描述】:

我有一个不寻常的问题,我不知道为什么:

我有以下方法:

 - (NSString*) copyAndReplaceOccurencesForProfileFromString: (NSString*)initialString toString:(NSString*)aString
{

        aString = [NSString stringWithString:initialString];
        DLog(@"PROFILE INITIAL HTML STRING: %@", initialString);

        aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_IMAGE//" withString:profileImageForHTML];
        aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_NAME//" withString:profileBirthNameString];
        aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_BIRTHDATE//" withString:profileDateOfBirthString];
        return aString;
    }

这样称呼:

    NSString *profileSection = [NSString string];
[self copyAndReplaceOccurencesForProfileFromString:htmlBody_profile toString:profileSection];
DLog(@"PROFILE MODIFIED HTML STRING: %@", profileSection);

但“profileSection”字符串返回空。

在调用 return 之前,我必须指出“aString”中有值。

知道为什么会这样吗? 谢谢!

【问题讨论】:

    标签: objective-c ios xcode nsstring


    【解决方案1】:

    编辑:看看

       NSString *profileSection = [NSString string]; //reference created
    

    再次在profileSection作为aString传入方法时:

       aString = [NSString stringWithString:initialString]; //new reference created
    

    现在 profileSection 永远不能保存因引用不同而被操纵的字符串。


    让你的函数返回一个新的 NSString。

    - (NSString*) copyAndReplaceOccurencesForProfileFromString: (NSString*)initialString
    {
            NSString *aString = [NSString stringWithString:initialString];
            DLog(@"PROFILE INITIAL HTML STRING: %@", initialString);
    
            aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_IMAGE//" withString:profileImageForHTML];
            aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_NAME//" withString:profileBirthNameString];
            aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_BIRTHDATE//" withString:profileDateOfBirthString];
            return aString;
    }
    

    现在使用like:

    NSString *profileSection = [self copyAndReplaceOccurencesForProfileFromString:htmlBody_profile];
    DLog(@"PROFILE MODIFIED HTML STRING: %@", profileSection);
    

    【讨论】:

    • 谢谢!有用 :) !你能解释一下我的概念有什么缺陷吗?
    • 我认为第一行应该是NSString *aString = [NSString stringWithString:initialString]; 或类似的东西,不是吗?
    • 是的,你说得对,它应该作为提供自动引用字符串并在其中添加字符串
    • 你如何理解你在这方面的错误?
    【解决方案2】:

    我认为您误解了return 的工作原理。它不操纵从调用者传递的参数值,而是确定方法调用完成后计算的值。所以说你有一个方法-(id)someMethod,然后这样调用它:

    id myValue = [self someMethod];

    someMethod 内部,有一个return 语句-return 右侧的内容将在调用方法或函数中分配给myValue

    要将其应用于您的情况,请更改您的方法,例如:

     - (NSString*) replaceOccurencesOfProfileInString:(NSString *)initialString
    {
    
            NSString *aString = initialString;
    
            DLog(@"PROFILE INITIAL HTML STRING: %@", initialString);
            NSData *profileImageData = UIImagePNGRepresentation(profileImage);
            NSString *profileImageDataString = [profileImageData base64EncodedStringSingleLine];
            NSString *profileImageForHTML = [NSString stringWithFormat:@"<p><b><img src='data:image/png;base64,%@' width='%f' height='%f'></b></p>", profileImageDataString, profileImage.size.width, profileImage.size.height];
    
            aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_IMAGE//" withString:profileImageForHTML];
            aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_NAME//" withString:profileBirthNameString];
            aString = [aString stringByReplacingOccurrencesOfString:@"//PROFILE_BIRTHDATE//" withString:profileDateOfBirthString];
            return aString;
        }
    

    然后将您的调用代码更改为:

    NSString *profileSection = [self replaceOccurencesOfProfileInString: htmlBody_profile];
    

    现在,您已经创建了一个新的NSString 实例并将其返回给调用者,并在调用者处将其分配给profileSection 变量。

    希望这会有所帮助!

    【讨论】:

    • 谢谢!现在我明白了,但这对我来说很奇怪,因为我在 NSMutableArray 参数中使用了相同的技术并且它有效......
    • @codeFi 是的,这是因为我们将 pointers 作为这些参数传递给对象。因此,当您向NSMutableArray 实例发送消息时,您将该消息发送到调用者上下文中的同一实例。但是,当您更改指向对象的指针的值时,就像您在此处所做的那样,这不会反映在调用者上下文中,因为参数是指针的副本。如果您确实需要更改一个也需要指向参数的指针,则必须将指向该指针的指针作为参数传递并从那里开始。
    • @codeFi 不客气,学习有关该语言及其工作原理的大量细节可以非常丰富您编写的代码,我强烈推荐它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2011-12-21
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多