簡體   English   中英

關於iPhone上的ivars和@property的問題

[英]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方法中執行的操作,需要釋放已retaincopy的實例變量。 因此,在您的示例中,您需要執行[receivedData release]; 在你dealloc方法,因為當你設置receivedData伊娃,你保留了新的值(這是什么retain的手段@property線)。 如果您未在@property聲明中指定retaincopy ,則默認為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM