2012-03-19 18 views
16

मैं एक श्रेणी NSAttributedString (परिवर्धन) का उपयोग कर रहा हूं और मुझे वास्तव में एक ऐसी संपत्ति जोड़ने का एक तरीका चाहिए जो स्ट्रिंग HTML टैग है या नहीं, तो एक बूल होगा। मुझे पता है कि श्रेणियों में संपत्ति नहीं होनी चाहिए, लेकिन जिस तरह से मुझे इसे करने की ज़रूरत है। मैं अपने खुद के गेटर्स और सेटर्स लिखने थक गया लेकिन यह काम नहीं किया। कोई भी जानता है कि यह कैसे काम करेगा?एक श्रेणी में BOOL संपत्ति कैसे जोड़ें?

+0

[उद्देश्य-सी: श्रेणी में संपत्ति] के संभावित डुप्लिकेट (http: // stackoverflow।कॉम/प्रश्न/8733104/उद्देश्य-सी-संपत्ति-श्रेणी में) –

+0

अपने गेटर्स और सेटर्स के लिए कोड पोस्ट करें! – paulmelnikow

उत्तर

4

श्रेणियां केवल-पढ़ने योग्य गुण हो सकती हैं, आप केवल उनके साथ इंस्टेंस चर जोड़ नहीं सकते हैं (ठीक है, आप सॉर्ट कर सकते हैं - सहयोगी संदर्भ देखें)।

आप एक श्रेणी विधि (केवल पढ़ने की संपत्ति द्वारा प्रस्तुत) जोड़ सकते हैं isHTMLTag जो एक बूल लौटाएगा, आपको गणना करना होगा कि क्या यह उस विधि के भीतर हर बार एक HTML टैग था या नहीं।

आप के लिए एक रास्ता के लिए पूछ रहे हैं, तो सेट बूल मान तो आप संबद्ध संदर्भ (objc_setAssociatedObject) जो मैं बहुत उपयोग नहीं किया है किसी भी अधिक विस्तार में पर जवाब देने के लिए योग्य नहीं लग रहा है का उपयोग करना होगा।

+1

संबंधित संदर्भों का उपयोग काम किया! धन्यवाद – Mace

+0

आप साझा करते हैं कि आप इसे वास्तव में कैसे काम करते हैं? –

+3

@ मैस - क्या आप या तो जर्टूरटन के जवाब को स्वीकार कर सकते हैं, और यहोशू से विवरण जोड़ सकते हैं, या यहोशू के जवाब को स्वीकार कर सकते हैं ...? –

0

यदि आपको वास्तव में कोई संपत्ति जोड़ने की आवश्यकता है, तो आपको श्रेणी जोड़ने के बजाय उप-वर्ग बनाना चाहिए।

@interface एक वस्तु कुंजी की आवश्यकता के बिना

@interface ClassName (CategoryName) 
@property (readwrite) BOOL boolProperty; 
@end 

@implementation

#import <objc/runtime.h> 

static char const * const ObjectTagKey = "ObjectTag"; 
@implementation ClassName (CategoryName) 
- (void) setBoolProperty:(BOOL) property 
{ 
    NSNumber *number = [NSNumber numberWithBool: property]; 
    objc_setAssociatedObject(self, ObjectTagKey, number , OBJC_ASSOCIATION_RETAIN); 
} 

- (BOOL) boolProperty 
{ 
    NSNumber *number = objc_getAssociatedObject(self, ObjectTagKey); 
    return [number boolValue]; 
} 
@end 
+1

कभी-कभी यह संभव नहीं है। उदाहरण के लिए, यदि कोड जो कहा वर्ग का उदाहरण बनाता है वह सुलभ नहीं है (उदा। एक स्थिर पुस्तकालय में)। –

38

पूर्णता के लिए के लिए, यह कैसे मैं इस काम मिल गया है और वाक्यविन्यास पढ़ने के लिए थोड़ा आसान

एनएसएसटींग + सहायता er.h

#import <Foundation/Foundation.h> 

@interface NSString (Helper) 

@property (nonatomic, assign) BOOL isHTML; 

@end 

NSString + Helper.h

#import "NSString+Helper.h" 
#import "objc/runtime.h" 

@implementation NSString (Helper) 

- (void)setIsHTML:(BOOL)isHTML 
{ 
    NSNumber *isHTMLBool = [NSNumber numberWithBool:isHTML]; 
    objc_setAssociatedObject(self, @selector(isHTML), isHTMLBool, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (BOOL)isHTML 
{ 
    NSNumber *isHTMLBool = objc_getAssociatedObject(self, @selector(isHTML)); 
    return isHTMLBool.boolValue; 
} 

@end 
+0

मेमोरी प्रबंधन के बारे में क्या? NSNumber इंस्टेंस को स्वयं -setBoolProperty के भीतर स्वयं द्वारा बनाए रखा जाता है: विधि। क्या मुझे इसे किसी भी तरह रिलीज करने की ज़रूरत है? Runtime.h से: "@param मान ऑब्जेक्ट के लिए कुंजी कुंजी के साथ संबद्ध करने के लिए मान। मौजूदा एसोसिएशन को साफ़ करने के लिए पास करें।" लेकिन मैं एक श्रेणी में dealloc ओवरराइड नहीं कर सकता। – igrek

+0

यहां एक उत्तर मिला: http://stackoverflow.com/questions/10842829/will-an-associated-object-be-released-automatically/10843510#10843510 यह ठीक से जारी किया गया है – igrek

+0

वैसे, आप अतिरिक्त स्थिरांक का उपयोग कर छोड़ सकते हैं कुंजी के लिए; इसके बजाय, ऑब्जेक्टटाग्की के बजाय बस @ सेलेक्टर (बूलप्रोपर्टी) का उपयोग करें, जो आपको – igrek

0

शायद बहुत इस दुनिया में देर हो गई, जब तेजी से पहले से ही व्यापक है उद्देश्य सी। किसी भी तरह, एक्सकोड 8 के साथ, आप सहयोगी संदर्भों का उपयोग करने के बजाय कक्षा गुणों का भी उपयोग कर सकते हैं।

@interface ClassName (CategoryName) 
    @property (class) id myProperty; 
@end 

@implementation 
static id *__myProperty = nil; 

+ (id)myProperty { 
    return __myProperty; 
} 

+ (void)setMyProperty:(id)myProperty { 
    __myProperty = myProperty; 
} 

@end

Xcode 8 रिलीज नोट्स से:

ऑब्जेक्टिव-सी अब वर्ग गुण, जिसके साथ स्विफ्ट प्रकार गुण interoperate का समर्थन करता है। उन्हें इस प्रकार घोषित किया गया है: @property (वर्ग) एनएसएसटींग * कुछ स्ट्रिंगप्रोपर्टी; वे कभी संश्लेषित नहीं होते हैं। (23891898)

0

स्विफ्ट 3:

इस पद्धति का उपयोग करके आप किसी भी नए संपत्ति जोड़ सकते हैं रोमांचक वर्ग के लिए (यहाँ बूल मान जोड़ें)।

import ObjectiveC 

private var xoAssociationKey: UInt8 = 0 

extension <ClassName> { 
    var <propertyName>: Bool! { 
     get { 
      if let returnVal = objc_getAssociatedObject(self, &xoAssociationKey) as? Bool{ 
       return returnVal 
      }else{ 
       return false 
      } 

     } 
     set(newValue) { 

      objc_setAssociatedObject(self, &xoAssociationKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 
} 
संबंधित मुद्दे