If you need an NSString over several EventLoop, you can also create the NSString with CFStringCreate(...) and release it later, because PB's EventLoop uses an NSAutoreleasePool.
Code: Select all
;-TOP my mk-soft, v1.01.0, 23.08.2022
ImportC "-framework CoreFoundation"
CFStringCreateWithCharacters(alloc, chars, numChars) ; chars = unichar
CFRelease(ref)
EndImport
Macro CFStringCreate(String)
CFStringCreateWithCharacters(0, @String, Len(String))
EndMacro
; ----
Macro CocoaString(NSString)
PeekS(CocoaMessage(0, NSString, "UTF8String"), -1, #PB_UTF8)
EndMacro
Macro CocoaString2(NSString)
PeekS(CocoaMessage(0, NSString, "cStringUsingEncoding:", #NSUnicodeStringEncoding))
EndMacro
Macro NSStringCreate(String)
CocoaMessage(0, 0, "NSString stringWithString:$", @String)
EndMacro
Macro NSStringCreate2(String)
CocoaMessage(0, 0, "NSString stringWithCharacters:", @String, "length:", Len(String)) ; String = unichar
EndMacro
Macro NSStringCreate3(String)
CocoaMessage(0, 0, "NSString stringWithBytes:", @String, "length:", StringByteLength(String), "encoding:", #NSUTF16LittleEndianStringEncoding)
EndMacro
; ----
CompilerIf #PB_Compiler_IsMainFile
NSPool = CocoaMessage(0, 0, "NSAutoreleasePool new") ; make threadsafe ifs use
sVal.s = "Hello World! "
NSString1 = NSStringCreate(sVal)
NSString2 = NSStringCreate2(sVal)
NSString3 = NSStringCreate3(sVal)
NSString4 = CFStringCreate(sVal)
Debug "1: " + CocoaString(NSString1)
Debug "2: " + CocoaString2(NSString2)
Debug "3: " + CocoaString(NSString3)
Debug "4: " + CocoaString2(NSString4)
CocoaMessage(0, NSPool, "release")
CFRelease(NSString4)
CompilerEndIf