سؤال

أحاول تحديد الطريقة الموصى بها لتعيين القيم الافتراضية لخصائص NSString.

أتفهم أنه ليس من الآمن استخدام أساليب الملحقات في أساليب init و dealloc للفئة. غالبًا ما يكون لدي ثوابت سلسلة أود تعيين القيم الافتراضية. ما هي طريقة التوصية للقيام بذلك (بالنظر إلى أن Ivar سيتم إصداره في طريقة Dealloc)؟

على سبيل المثال ، أفهم أن ما يلي غير آمن:

@property (nonatomic, copy) NSString *identifier;
....

- (id) init
{ 
    self = [super initWithLayer:displayLayer];

    if (self != nil)
    {
        self.identifier = @"fireSpell01";
    }

    return self;
}

هل هو موافق ، أو أوصي بذلك:

identifier = [@"fireSpell01" retain];

أو يجب أن أفعل هذا:

identifier = [[NSString stringWithString:@"fireSpell01"] retain];
هل كانت مفيدة؟

المحلول

فقط افعل هذا:

identifier = @"fireSpell01";

ليست هناك حاجة retain السلسلة. توجد ثوابت السلسلة لعمر البرنامج ولا تحتاج أبدًا إلى الاحتفاظ بها أو إطلاقها. عمل [[NSString stringWithString:@"fireSpell01"] retain] فقط يخلق نسخة غير ضرورية ولا معنى لها.

ما تريد تجنبه هو استخدام مستقديات الممتلكات في init و dealloc طُرق. نظرًا لأن المستقلين قد يكون لهم آثار جانبية تعتمد على بعض قيم الحالة ، فأنت لا ترغب في الاتصال بهم على الكائنات التي تم إنشاؤها جزئيًا/تم تدميرها جزئيًا. من الأفضل بكثير التعيين مباشرة إلى IVARs وتخطي المستوطنين أثناء init.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top