簡體   English   中英

Obj-C屬性,范圍和幫助程序類

[英]Obj-C properties, scopes, and helper classes

我一直在嘗試了解iOS系統的一些細微差別,以及我不清楚的一項內容。 我正在構建一個類來封裝訪問日歷的方法,包括創建事件,事件存儲單例和異步提取操作。

類變量和實例變量混合在一起,但是我很難使它起作用。

我的問題是這個。

讓我們看一下這個項目。

http://developer.apple.com/library/ios/#samplecode/SimpleDrillDown

Play類封裝有關播放的信息。

@interface Play : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSArray *characters;
@property (nonatomic, strong) NSString *genre;
@property (nonatomic, strong) NSDate *date; 
@end

#import "Play.h"
@implementation Play
@synthesize title, characters, genre, date;
@end

由於綜合的原因,如果我正確理解的話,就沒有dealloc方法。

現在,沒有定義其他方法。

在示例項目的Details Controller中,該對象根本沒有初始化,但是屬性可以通過引用訪問,這使我感到困惑。 如果我嘗試在Play中編寫方法,則這些方法將無法更改屬性中的值。 例如,如果您嘗試將數據控制器類與播放類合並,我注意到方法無法設置並從屬性中獲取值。

例如,如果我添加到Play類中:

(void)createSamplePlay
{
    self.title = @"Play 1";
    self.characters = [NSArray arrayWithObject:[NSString stringWithFormat:@"Character 1"]];
    self.genre = @"Genre 1";
    self.date = [NSDate date];
}

然后,我在Details Controller中調用該方法,實際上什么都沒有改變。 如果將方法移到Details Controller的內部,則聲明一個靜態類型的屬性Play *play ,然后調用方法[self createSamplePlay]; 然后改成self play ,然后這些方法當然起作用了。

我不知道我的理解是否存在根本性的誤解,或者僅僅是上面的代碼在寫,而我的實際項目和更長的項目卻出錯了。

同時,我將繼續閱讀developer.apple.com上的Obj-C PDF。

編輯:

抱歉,這是我最后意圖的一個壞例子。

假設我想編寫一個執行此操作的方法:

-(void)fillInMissingGenre
{
    if([self.title caseInsensitiveCompare:@"Romeo and Juliet"] == 0){
        self.genre = @"Tragedy";
    }
}

在示例代碼中, Play數據控制器實例化,該數據控制器返回到控制器,然后通過Detail Controller的 Play屬性傳遞給Detail Controller 除非先前的實體之一決定取消引用該對象,否則Root和Detail都應能夠調用Play的方法。

我開始懷疑這是造成我問題的原因,因為有時Play對象的所有內容返回nil,然后有時我會得到一個Exec_Bad_Access。 如果我只是學會使用該調試器。

由於綜合的原因,如果我正確理解的話,就沒有dealloc方法。

錯了 因為該代碼是為ARC(自動引用計數)編寫的,所以沒有dealloc 它與@synthesize無關。

除此之外,我認為您缺少類和對象之間的區別。 這些屬性是在Play 上定義的,但是要實際使用它們(存儲數據),您需要創建該類的對象實例 您可以這樣做:

Play *myPlay = [[Play alloc] init];

現在,您可以使用對象 myPlay (或更確切地說, myPlay是指向對象的指針)來執行諸如`myPlay.title = @“ Play 1”的操作;

如果不創建實例,它將無法正常工作:

Play *myPlayNoInstance;
myPlayNoInstance.title = @"Play 2"; // doesn't do anything

因為在這里, myPlayNoInstance是一個不指向已分配對象的指針。

如果我正確理解您的意圖,則createSamplePlay是工廠方法。 如果此假設正確,則應在Play類中聲明它(注意+ -這是一個類方法的指示符),然后重寫實現如下:

+ (id) createSamplePlay
{
    self = [[Play  alloc] init];
    self.title = @"Play 1";
    self.characters = [NSArray arrayWithObject:[NSString stringWithFormat:@"Character 1"]];
    self.genre = @"Genre 1";
    self.date = [NSDate date];
    return self;
}

稍后,您可以在代碼中使用它:

Play *sample = [Play createSamplePlay];

由於綜合的原因,如果我正確理解的話,就沒有dealloc方法。

不,由於自動引用計數,dealloc不存在( strong修飾符的存在表明您在ARC領域中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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