我有以下代码。当我打印出一个字符串时,它是再见,当我打印出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的值也会发生变化,反之亦然。我怎样才能做到这一点?
答案 0 :(得分:4)
这是一个逐行显示代码中的内容的可视化。
aString –––––––––> @"Helloworld"
的
aString –––––––––> @"Helloworld"
^
|
bString –––––––––––––––––
的
aString –––––––––> @"Goodbye" @"Helloworld"
^
|
bString ––––––––––––––––––––––––––––––
如您所见,将aString
指向另一个对象对bString
已指向的对象没有影响。你最终会得到两个指向不同对象的指针。
为了实现让aString
和bString
指向同一个对象(您需要能够更改)所需的行为,您将需要一个 mutable < / em>对象(例如NSMutableString
,正如富兰克林所说)。
这将允许你改变底层对象,而不是创建和指向一个新对象 - 因此aString
和bString
将在突变后保持指向同一个对象,允许他们两者观察相同的值。
突变看起来像这样:
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指针执行不同的内存区域。