2009-05-05 7 views
14

मैं अपने आवृत्ति चर के लिए गुणों का उपयोग करना चाहता हूं, लेकिन कई मामलों में, मैं केवल कक्षा को ही सेटटर तक पहुंच प्राप्त करना चाहता हूं। मुझे उम्मीद थी कि मैं कुछ इस तरह कर सकता है:क्या मैं सार्वजनिक गेटर और निजी सेटर के साथ संपत्तियां बना सकता हूं?

Foo.h:

@interface Foo { 
    NSString *bar; 
} 
@property (readonly) NSString *bar; 
@end 

Foo.m:

#import "Foo.h" 

@interface Foo() 
@property (copy) NSString *bar; 
@end 

@implementation Foo 
@synthesize bar; 
@end 

लेकिन यह एक चेतावनी उत्पन्न करता है:

Foo.m:4: warning: property ‘bar’ attribute in ‘Foo’ class continuation does not match class ‘Foo’ property 

मैं देख सकते हैं कि यह किस बारे में शिकायत कर रहा है, लेकिन यह अभी भी एक उपयोगी मुहावरे जैसा लगता है। क्या मेरे स्वयं के सेटर्स लिखने के बिना इसे पूरा करने का कोई और तरीका है?

उत्तर

31

आपका दृष्टिकोण सही है, लेकिन कक्षा विस्तार में @property bar का पुनर्विक्रय रीड्राइट बनाम रीडोनली को छोड़कर मूल घोषणा से मेल खाना चाहिए। तो यह काम करेगा:

Foo.h

@interface Foo { 
    NSString *bar; 
} 
@property (copy,readonly) NSString *bar; 
@end 

Foo.m:

#import "Foo.h" 

@interface Foo() 
@property (copy,readwrite) NSString *bar; 
@end 

@implementation Foo 
@synthesize bar; 
@end 

(याद है कि डिफ़ॉल्ट गुणों के लिए assign, नहीं copy है)।

+0

हू, जो कि 'कॉपी' के बाद से मेरे साथ कभी नहीं हुआ, अन्यथा गेटटर के लिए अप्रासंगिक है। धन्यवाद! –

3

जब बैरी कहते हैं कि वे इसका मतलब है बना रहेगा कि इस तरह निर्दिष्ट किया जाना चाहिए "डिफ़ॉल्ट गुणों के लिए बनाए रखने के है":

@property (retain) NSDate *endDate; 

वे इस तरह छोड़ दिया जाता है:

@property NSDate *endDate; 

असाइन द्वारा माना जाता है कंपाइलर

+1

मुझे पूरा यकीन है कि उसका मतलब वह था जो उसने कहा था, लेकिन आप सही हैं- 'असाइन करें' डिफ़ॉल्ट है, 'बनाए रखना' नहीं है। http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW27 –

संबंधित मुद्दे