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