| 
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