10

Bir sınıfın özel özelliklerini bildirme olasılığını, söz konusu sınıfın uygulama (.m) dosyasında bildirilen bu sınıfta adlandırılmamış bir kategoriye yerleştirerek tanıyorum. Ne yapmak istediğim değil.Adlandırılmış bir kategori içinde özel bir mülkü nasıl bildirebilirim?

Bu sınıfa bazı işlevler ekleyen bir sınıfta adlandırılmış bir kategori ile uğraşıyorum. Bu işlevsellik için, benim kategorimde kullanmak için özel bir mülkiyete sahip olmamda bana çok yardımcı olur - bu yüzden bunu (yukarıda açıklandığı gibi) gerçekleştirmenin normal yolu benim için işe yaramıyor. Yoksa öyle mi? Lütfen beni aydınlat!

cevap

22

Kategorinizin uygulama dosyasında, başka bir kategori bildirin ve MyCategoryName_Private gibi bir şey olarak adlandırın ve özel mülklerinizi burada bildirin. İlişkilendirilmiş nesneleri kullanarak -propertyName ve -setPropertyName: yöntemlerinin uygulanmasını sağlayın.

Örneğin, uygulama dosyası aşağıdaki gibi görünebilir:

#import "SomeClass+MyCategory.h" 
#import <objc/runtime.h> 

@interface SomeClass (MyCategory_Private) 

@property (nonatomic, strong) id somePrivateProperty; 

@end 

@implementation SomeClass (MyCategory_Private) 

static void *AssociationKey; 

- (id)somePrivateProperty 
{ 
    return objc_getAssociatedObject(self, AssociationKey); 
} 

- (void)setSomePrivateProperty:(id)arg 
{ 
    objc_setAssociatedObject(self, AssociationKey, arg, OBJC_ASSOCIATION_RETAIN); 
} 

@end 

@implementation SomeClass (MyCategory) 

// implement your publicly declared category methods 

@end 
+1

Yahey, çok teşekkür ederim! Tam olarak aradığım şey bu! Belki bazı insanlar bunu en iyi kodlama pratiği olarak görmezler, bir kategoriyi tamamen bir “m” dosyasına sokarlar, ama yine de bu benim problemimi çözer ve benim için çok daha kolay şeyler yapar :) –

+1

Güzel. Teşekkür ederim! – theDuncs

+0

Daha fazla özel mülk sahibi olmak istiyorsam daha fazla AssociationKey oluşturmalıyım? – allenlinli

İlgili konular