[英]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.