Page 1 of 1

NSString Helper Macros

Posted: Tue Aug 23, 2022 4:53 pm
by mk-soft
Various macros for NSString to choose from.

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