[英]Question about ivars and @property's on the iPhone
我有一個關於實例變量如何工作以及何時使用@property的問題。 這是我正在使用的示例接口文件
@interface PackageModel : NSObject {
NSString *tracking;
NSString *carrier;
NSString *status;
NSMutableDictionary *events;
// Connection ivars
NSMutableData *receivedData;
// Parsing ivars
int tagLevel;
NSMutableArray *tagTree;
NSString *parentTag;
NSString *currentTag;
}
@property (nonatomic, retain) NSMutableData *receivedData;
- (id)initWithTrackingString:(NSString *)string;
- (void)getPackageDataWithEvents;
- (void)printMe;
@end
如何在文件的代碼中訪問它們。 我是否可以僅使用以下方法訪問此類方法中的跟蹤,運營商和狀態?
tracking = [[NSString alloc] initWithString:@"Hello World"];
另外,需要在dealloc中放入哪些變量? 只有我在@ property / @ synthesize中具有的變量? 還是我需要在dealloc方法中釋放所有實例變量。
我只是在尋找一些有關實例變量在Objective-C中如何工作的說明。 謝謝。
@property
聲明只不過是編譯器生成的getter和setter方法。 而已。 只是方法。 顯然,您必須獲取並設置一些東西 ,因此我們創建了與getter和setter一起使用的ivar。 在上面的示例中,編譯器正在生成:
- (NSMutableData *) receivedData;
- (void) setReceivedData:(NSMutableData *)newReceivedData;
getter返回receivedData
實例變量中的值,而setter更改receivedData
實例變量中的值。
(附帶說明:在64位運行時中,您可以跳過聲明實例變量的步驟,但我仍然希望將其放在明確的位置)
至於應該在dealloc
方法中執行的操作,需要釋放已retain
或copy
的實例變量。 因此,在您的示例中,您需要執行[receivedData release];
在你dealloc
方法,因為當你設置receivedData
伊娃,你保留了新的值(這是什么retain
的手段@property
線)。 如果您未在@property
聲明中指定retain
或copy
,則默認為assign
,而您無需執行任何操作。 除此之外,您還需要釋放自己保留的任何其他實例變量(即,不通過@property (retain)
設置器)。
對於最后一個問題,是的,您可以這樣做:
tracking = [[NSString alloc] initWithFormat:@"Hello, %@!", @"world"];
在您自己的類中,您可以直接訪問您自己的所有實例變量(以及您的超類的所有受保護和公共ivars)。
kes,這是一個非常廣泛的問題。 我強烈建議您閱讀Apple的Objective-C Primer及其對語言的完整引用 。
首先,您會問:“如何在文件的代碼中訪問它們?” 您沒有指定哪個文件。 在PackageModel
的@implementation
內部,您可以像在跟蹤示例中一樣簡單地引用實例變量。 您無法輕松地從其他類訪問它們。
但是,如果將它們設置為@properties
並進行@synthesize
,則可以像在self.tracking
之類的類中訪問它們。 而且,您現在還可以從其他類訪問它們。
PackageModel *model = [[PackageModel alloc] init];
model.receivedData = [NSMutableData data];
這些屬性的另一個優點是它們可以為您處理內存管理。 正確完成后,您真的不必擔心保留和釋放。 這receivedData
你的財產PackageModel
類將分配新數據之前自動釋放任何先前保持的對象。 這是光榮的。 發生這種情況是因為編譯器自動“合成” setter和getter,然后通過點運算符調用它們以進行訪問。
最后要注意的是,這些設置器和獲取器由@synchronize
塊自動保護,該塊確保操作是原子發生的(並且第二個線程不會中斷中間的活動)。 這在iPhone上基本上是不需要的,並且會導致相當大的開銷,因此,除了讀取/寫入權限和內存管理方案之外,您還應該將所有屬性聲明nonatomic
。
沒有覆蓋的是您的最后一行代碼可能是:
tracking = @"Hello World";
“ @”基本上是為您創建字符串對象。
使用@ property / @ syntehsize的一個優點是,它促使您對ivars使用訪問器方法。 這可以幫助您更好地進行內存管理。 在iPhone上,您是否有兩個重要原因需要注意保留計數:1.降低內存使用率。 2.避免崩潰。 當您直接訪問ivars時,您會冒着忘記保留變量的風險,然后稍后再訪問它,只是發現它已被釋放。 或相反,您忘記釋放變量,很快您就建立了太多的內存,iPhone OS告訴您終止應用程序。
通常,即使在類內部使用訪問器方法也是一個好主意。 我通常直接設置ivars的唯一位置是該類的init方法內部。 我通常還會在dealloc方法中釋放所有的ivars。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.