|
2 | 2 |
|
3 | 3 | namespace tns {
|
4 | 4 |
|
5 |
| -// Moved this method in a separate .cpp file because ARC destroys the class |
6 |
| -// created with objc_allocateClassPair when the control leaves this method scope |
| 5 | +// Moved this method in a separate .cpp file because ARC destroys the class created with objc_allocateClassPair |
| 6 | +// when the control leaves this method scope |
7 | 7 |
|
8 |
| -Class ClassBuilder::GetExtendedClass(std::string baseClassName, |
9 |
| - std::string staticClassName) { |
10 |
| - Class baseClass = objc_getClass(baseClassName.c_str()); |
11 |
| - std::string name = |
12 |
| - !staticClassName.empty() |
13 |
| - ? staticClassName |
14 |
| - : baseClassName + "_" + |
15 |
| - std::to_string(++ClassBuilder::classNameCounter_); |
16 |
| - // here we could either call objc_getClass with the name to see if the class |
17 |
| - // already exists or we can just try allocating it, which will return nil if |
18 |
| - // the class already exists so we try allocating it every time to avoid race |
19 |
| - // conditions in case this method is being executed by multiple threads |
20 |
| - Class clazz = objc_allocateClassPair(baseClass, name.c_str(), 0); |
| 8 | +Class ClassBuilder::GetExtendedClass(std::string baseClassName, std::string staticClassName) { |
| 9 | + Class baseClass = objc_getClass(baseClassName.c_str()); |
| 10 | + std::string name = !staticClassName.empty() ? staticClassName : baseClassName + "_" + std::to_string(++ClassBuilder::classNameCounter_); |
| 11 | + Class clazz = objc_getClass(name.c_str()); |
21 | 12 |
|
22 |
| - if (clazz == nil) { |
23 |
| - int i = 1; |
24 |
| - std::string initialName = name; |
25 |
| - while (clazz == nil) { |
26 |
| - name = initialName + std::to_string(i++); |
27 |
| - clazz = objc_allocateClassPair(baseClass, name.c_str(), 0); |
| 13 | + if (clazz != nil) { |
| 14 | + int i = 1; |
| 15 | + std::string initialName = name; |
| 16 | + while (clazz != nil) { |
| 17 | + name = initialName + std::to_string(i++); |
| 18 | + clazz = objc_getClass(name.c_str()); |
| 19 | + } |
28 | 20 | }
|
29 |
| - } |
30 | 21 |
|
31 |
| - objc_registerClassPair(clazz); |
32 |
| - return clazz; |
| 22 | + clazz = objc_allocateClassPair(baseClass, name.c_str(), 0); |
| 23 | + |
| 24 | + objc_registerClassPair(clazz); |
| 25 | + return clazz; |
33 | 26 | }
|
34 | 27 |
|
35 |
| -} // namespace tns |
| 28 | +} |
0 commit comments