我一直在努力了解iOS系统的一些细微差别和一个我不清楚的项目。我正在构建一个类来封装访问日历的方法,其中包括创建事件,事件存储单例和异步获取操作。
有一些类变量和实例变量,但我很难让它工作。
我的问题是这个。
让我们看看这个项目。
http://developer.apple.com/library/ios/#samplecode/SimpleDrillDown
播放类会封装有关播放的信息。
@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中编写方法,则方法无法更改属性中的值。例如,如果您尝试将Data 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
由数据控制器实例化,返回 Root 控制器,然后传递给细节控制器,通过细节控制器播放属性。 Root和Detail都应该能够调用 Play的方法,除非之前的某个实体决定取消引用该对象。
我开始怀疑这是我的问题的原因,因为有时候Play
对象返回所有内容的nil,然后有时我得到一个Exec_Bad_Access。如果我只学会使用该调试器。 。
答案 0 :(得分:3)
由于合成,如果我理解正确的话,就没有dealloc方法。
那是错的。没有dealloc
,因为此代码是为ARC(自动引用计数)编写的。它与@synthesize
无关。
除此之外,我认为你错过了一个类和一个对象之间的区别。属性在Play
类上定义,但要实际使用它们(存储数据),您需要创建对象或实例< / em>班级。你这样做:
Play *myPlay = [[Play alloc] init];
现在你可以使用对象 myPlay
(或更确切地说,myPlay
是一个指向对象的指针)来执行诸如`myPlay.title = @“之类的游戏1" ;
如果您不创建实例,它将无效:
Play *myPlayNoInstance;
myPlayNoInstance.title = @"Play 2"; // doesn't do anything
因为在这里,myPlayNoInstance
是一个不指向已分配对象的指针。
答案 1 :(得分:1)
如果我理解你的意图,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区域内)。