Это не связано ни с размером класса, ни с количеством свойств.
Вероятно, это связано с тем, что у вас проблема с памятью. Когда свойств не слишком много, память, используемая для получения имени и типа свойства в переменных const char*
, все еще там, но когда вы начинаете иметь слишком много свойств для циклического выполнения, эти зоны памяти стираются новыми значениями, поэтому авария.
Это, вероятно, связано с тем, что strsep
также не является реентерабельным, поэтому циклическое использование и его многократное использование каждый раз использует один и тот же внутренний буфер символов.
Вы должны заставить ваш метод getPropertyType
напрямую возвращать объект NSData вместо const char*
байтов и использовать метод NSString
initWithData:encoding:
для построения строки из него (или переместить этот вызов initWithData:encoding:
в getPropertyType
напрямую и сделайте так, чтобы он возвращал объект NSString
напрямую. Таким образом, вы избежите управления указателями на зоны памяти, которые должны быть автоматически освобождены в ближайшее время.
Но Ваша проблема, вероятно, в том, что вы забыли проверить правильность буфера attribute
и особенно его длину, прежде чем пытаться получить доступ к байтам в этом буфере!
Особенно вы используете [NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4]
, не проверяя, что attribute
имеет длину не менее 4 символов!
Вот почему вызов dataWithBytes:length:
(который внутренне вызывает initWithBytes:length:copy:freeWhenDone:bytesAreVM:
) завершается с NSInvalidArgumentException
, сообщая, что вы передаете ему абсурдную длину 4294967294
(которая равна -2
, если интерпретируется как целое число со знаком)