指向同一对象的指针Objective-c

时间:2016-06-22 17:25:07

标签: objective-c pointers object nsstring nsmutablestring

我有以下代码。当我打印出一个字符串时,它是再见,当我打印出bString时,它就是Hellworld。不应该将bString指向与aString相同的对象。我希望两者都打印再见。此外,当我打印出指针的内存地址时,它们是不同的记忆地址。有人可以解释原因吗?

Sub subFindScrollIE()

'Set Variables
Dim boolFound As Boolean
Dim strTemp() As Variant, txt As String
Dim strOutput As String
Dim tbl As HTMLTable, tables As IHTMLElementCollection
Dim tr As HTMLTableRow, r As Integer, i As Integer
Dim tRows As IHTMLElementCollection
Dim ie As InternetExplorer
'Delete Rows and Select A1
Rows("1:100").Delete
ActiveSheet.Range("A1").Select


Set ie = New InternetExplorer

'Show Webpage (optional)
'ie.Visible = True
Dim dateToday As String

'Get Today's date in yyyymmmdd to input into URL for most today's alert page
dateToday = Format((Now), "yyyymmdd")


'Navigate to Desired URL with today's date
ie.Navigate "URL" & dateToday & ".html"

'Input Keywords
strTemp = Array("Keyword")

'Wait for IE page to finish loading
Do Until ie.ReadyState = READYSTATE_COMPLETE Or ie.ReadyState = READYSTATE_INTERACTIVE
    'DoEvents
Loop

    'Declare rows
Set allrows = ie.Document.body.getElementsByTagName("tr")

' loop through rows
For Each trow In allrows

    Set tcell = trow.Cells

    ' loop through cells
    For r = 0 To (tcell.Length - 1)

        Set td = tcell(r)

        ' loop through search text
        For i = 0 To UBound(strTemp)
            ' search row for string
            txt = LCase(td.innerHTML)
            If (InStr(txt, LCase(strTemp(i))) > 0) Then

             Application.PrintCommunication = True
                ' search string found. create output html table
                'strOutput = strOutput & tRows(r).outerHTML & vbCrLf
                strOutput = tcell(r).innerHTML

                'Output string to new workbook
                ActiveCell.Value = strOutput

                'Move one cell to the right for next possible match to be pasted
                ActiveCell.Offset(0, 1).Select


                'Reset string (just in case, not needed)
                Debug.Print strOutput
                strOutput = ""
            End If
        Next i
    Next r
Next trow
End Sub

我希望bString指向与aString相同的对象。因此,如果aString的值发生变化,那么bString的值也会发生变化,反之亦然。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:4)

这是一个逐行显示代码中的内容的可视化。

aString –––––––––> @"Helloworld"

aString –––––––––> @"Helloworld"
                        ^
                        |
bString –––––––––––––––––

aString –––––––––> @"Goodbye"   @"Helloworld"
                                     ^
                                     |
bString ––––––––––––––––––––––––––––––

如您所见,将aString指向另一个对象对bString已指向的对象没有影响。你最终会得到两个指向不同对象的指针。

为了实现让aStringbString指向同一个对象(您需要能够更改)所需的行为,您将需要一个 mutable < / em>对象(例如NSMutableString,正如富兰克林所说)。

这将允许你改变底层对象,而不是创建和指向一个新对象 - 因此aStringbString将在突变后保持指向同一个对象,允许他们两者观察相同的值。

突变看起来像这样:

aString –––––––––> @"Helloworld"
                        ^
                        |
bString –––––––––––––––––

aString –––––––––>  @"Goodbye"
                        ^
                        |
bString –––––––––––––––––

答案 1 :(得分:3)

NSString *aString = @"Helloworld";

在内存0x01(或某处)中有一个字符串@"Helloworld";然后将地址0x01分配给aString。之后

NSString *bString = aString;

地址0x01已分配给bString。警告!之后

aString = @"Goodbye";

地址0x01 @"Helloworld"!此行不会更改字符串。它会创建一个新字符串@"Goodbye"并将其存储在0x46(或0x01以外的其他位置),并将地址0x46分配给aString。要做你想做的事,试试NSMutableString

注意:不要创建新的NSMutableString;用

修改当前的那个
- (void)setString:(NSString *)aString

答案 2 :(得分:0)

1)每当您使用@""语法创建字符串时,框架将自动缓存字符串。 NSString是一个非常特殊的类,但框架会处理它。当您在应用的多个位置使用@"Some String"时,它们都将指向内存中的相同地址。只有当您使用-initWithData:encoding之类的内容时,字符串才会被缓存。

2)其他答案建议您应该使用-copy,但-copy只会在接收者可变的情况下创建不可变副本。 (如NSMutableString) 当您将-copy发送到不可变对象时,它将与-retain相同。

NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy = [originalString mutableCopy];
NSString *mutableCopyCopy = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];

originalString,copy,mutableCopyCopy和anotherString都将指向相同的内存地址,只有mutableCopy指针执行不同的内存区域。