1#import <Foundation/Foundation.h> 2#include <unistd.h> 3#import "my-base.h" 4 5@interface MyString : MyBase { 6 NSString *str; 7 NSDate *date; 8 BOOL _desc_pauses; 9} 10 11@property(retain) NSString * str_property; 12@property BOOL descriptionPauses; 13 14- (id)initWithNSString:(NSString *)string; 15@end 16 17@implementation MyString 18@synthesize descriptionPauses = _desc_pauses; 19@synthesize str_property = str; 20 21- (id)initWithNSString:(NSString *)string 22{ 23 if (self = [super init]) 24 { 25 str = [NSString stringWithString:string]; 26 date = [NSDate date]; 27 } 28 self.descriptionPauses = NO; 29 return self; 30} 31 32- (void)dealloc 33{ 34 [date release]; 35 [str release]; 36 [super dealloc]; 37} 38 39- (NSString *)description 40{ 41 // Set a breakpoint on '-[MyString description]' and test expressions: 42 // expression (char *)sel_getName(_cmd) 43 if (self.descriptionPauses) // Break here for description test 44 { 45 printf ("\nAbout to sleep.\n"); 46 usleep(100000); 47 } 48 49 return [str stringByAppendingFormat:@" with timestamp: %@", date]; 50} 51@end 52 53int 54Test_Selector () 55{ 56 SEL sel = @selector(length); 57 printf("sel = %p\n", sel); 58 // Expressions to test here for selector: 59 // expression (char *)sel_getName(sel) 60 // The expression above should return "sel" as it should be just 61 // a uniqued C string pointer. We were seeing the result pointer being 62 // truncated with recent LLDBs. 63 return 0; // Break here for selector: tests 64} 65 66int 67Test_NSString (const char *program) 68{ 69 NSString *str = [NSString stringWithFormat:@"Hello from '%s'", program]; 70 NSLog(@"NSString instance: %@", str); 71 printf("str = '%s'\n", [str cStringUsingEncoding: [NSString defaultCStringEncoding]]); 72 printf("[str length] = %zu\n", (size_t)[str length]); 73 printf("[str description] = %s\n", [[str description] UTF8String]); 74 id str_id = str; 75 // Expressions to test here for NSString: 76 // expression (char *)sel_getName(sel) 77 // expression [str length] 78 // expression [str_id length] 79 // expression [str description] 80 // expression [str_id description] 81 // expression str.length 82 // expression str.description 83 // expression str = @"new" 84 // expression str = [NSString stringWithFormat: @"%cew", 'N'] 85 return 0; // Break here for NSString tests 86} 87 88NSString *my_global_str = NULL; 89 90void 91Test_MyString (const char *program) 92{ 93 my_global_str = @"This is a global string"; 94 NSString *str = [NSString stringWithFormat:@"Hello from '%s'", program]; 95 MyString *my = [[MyString alloc] initWithNSString:str]; 96 NSLog(@"MyString instance: %@", [my description]); 97 my.descriptionPauses = YES; // Set break point at this line. Test 'expression -o -- my'. 98 NSLog(@"MyString instance: %@", [my description]); 99} 100 101int 102Test_NSArray () 103{ 104 NSMutableArray *nil_mutable_array = nil; 105 NSArray *array1 = [NSArray arrayWithObjects: @"array1 object1", @"array1 object2", @"array1 object3", nil]; 106 NSArray *array2 = [NSArray arrayWithObjects: array1, @"array2 object2", @"array2 object3", nil]; 107 // Expressions to test here for NSArray: 108 // expression [nil_mutable_array count] 109 // expression [array1 count] 110 // expression array1.count 111 // expression [array2 count] 112 // expression array2.count 113 id obj; 114 // After each object at index call, use expression and validate object 115 obj = [array1 objectAtIndex: 0]; // Break here for NSArray tests 116 obj = [array1 objectAtIndex: 1]; 117 obj = [array1 objectAtIndex: 2]; 118 119 obj = [array2 objectAtIndex: 0]; 120 obj = [array2 objectAtIndex: 1]; 121 obj = [array2 objectAtIndex: 2]; 122 NSUInteger count = [nil_mutable_array count]; 123 return 0; 124} 125 126 127int main (int argc, char const *argv[]) 128{ 129 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 130 Test_Selector(); 131 Test_NSArray (); 132 Test_NSString (argv[0]); 133 Test_MyString (argv[0]); 134 135 printf("sizeof(id) = %zu\n", sizeof(id)); 136 printf("sizeof(Class) = %zu\n", sizeof(Class)); 137 printf("sizeof(SEL) = %zu\n", sizeof(SEL)); 138 139 [pool release]; 140 return 0; 141} 142