1

異常な問題が発生しましたが、その理由がわかりません:

私は次の方法を持っています:

 - (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" には値が含まれていることを指摘しておく必要があります。

なぜこれが起こっているのですか?ありがとう !

4

2 に答える 2

2

編集:見てください

   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;
}

今のように使用します:

NSString *profileSection = [self copyAndReplaceOccurencesForProfileFromString:htmlBody_profile];
DLog(@"PROFILE MODIFIED HTML STRING: %@", profileSection);
于 2012-09-28T08:26:48.713 に答える
2

仕組みを誤解していると思いますreturn。呼び出し元から渡された引数の値を操作するのではなく、メソッド呼び出しが終了後に評価される値を決定します。たとえば、 method-(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ます。

お役に立てれば!

于 2012-09-28T08:31:12.413 に答える