Obj-C属性,作用域和帮助程序类

时间:2011-12-09 18:17:31

标签: iphone objective-c properties helper

我一直在努力了解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];并更改为selfplay,当然,方法有效。

我不知道在我的理解中是否存在根本的误解,或者只是上面的代码是写的,我在实际和更长的项目中都有错误。

与此同时,我将继续阅读 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。如果我只学会使用该调试器。 。

2 个答案:

答案 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区域内)。