为了给一个真实世界的例子,说基类是车辆和具体类是TwoWheeler和FourWheeler。 现在,这辆车的型号是TwoWheeler还是FourWheeler,是由基地车决定的。 当我使用alloc-init方法创buildTwoWheeler / FourWheeler的一个实例时,它会调用像下面这样的超级实现来设置Vehicle类中定义的公共属性的值,并且在这些属性之外,其中一个是实际决定types的types是TwoWheeler或FourWheeler。 if (self = [super initWithDictionary:dict]){ [self setOtherAttributes:dict]; return self; } 现在,当我收到车辆时,其中一些可能是TwoWheeler,另外一些则是FourWheeler。 因此,我不能直接创buildTwoWheeler或FourWheeler的实例 Vehicle *v = [[TwoWheeler alloc] initWithDictionary:dict]; 有什么办法可以创build一个基类的实例,一旦我知道types,根据types创build一个子类的实例并返回它。 随着目前的实施,这将导致无限循环,因为我称之为超级实现从具体类。 当我不知道哪个具体的类应该事先被实例化时,处理这个场景的完美devise是什么?
为了简单起见,可以说我正在为ios5制作一个秒表应用程序。 我有一个名为秒表,它代表了秒表的状态。 这个class级拥有储存经过时间的成员,秒表是否在跑步等等。 对我来说,似乎这个类应该在我的应用程序生命周期开始时实例化一次,因此我声明它是AppDelegate类的成员,并在AppDelegate类的didFinishLaunchingWithOptions:方法中实例化它 – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { Stopwatch *stopwatch = [[Stopwatch alloc] init]; return YES; } 但是,现在我发现自己需要能够在ViewController类中引用此秒表对象,但不知道如何操作。 我非常感谢有关如何解决这个问题的任何build议,因为它似乎是制作ios应用程序的一个基本概念。 谢谢!
我有一些关于在工作中使用属性和实例variables的讨论,所以我想find一个wiki的答案。 现在,我知道在Objective-C中没有真正的私有成员types,一切都非常公开。 不过,我有点担心我们应该devise我们的class级,也遵守面向对象的原则。 我想听听这三种devise方法的意见: 答:根据各个职位甚至到斯坦福大学新的iPhone开发课程,你应该随时随地使用属性。 然而,恕我直言,这种方法制动OOP的devise原则,因为在这种情况下,所有成员公开。 为什么我需要将所有内部/本地实例variables发布到外部? 另外,如果你通过属性使用合成的setter,而不是直接使用本地ivar,那么就会有一些(但仍然)开销。 这是一个示例: //==== header file =====// @interface MyClass : NSObject @property (nonatomic, retain) NSString *publicMemberWithProperty; @property (nonatomic, retain) NSString *propertyForPrivateMember; @end B.另一种方法是在头文件中声明ivars(不声明相对属性)私有成员,并在同一个头文件中为公共成员声明纯属性(不声明相对ivars)。 在这种情况下,Ivars将直接在课堂上使用。 这种方法是有道理的,但不能使用属性的所有好处,因为我们在设置新值之前手动释放旧值。 这是一个示例: //==== header file =====// @interface MyClass : NSObject{ NSString *_privateMember; } @property (nonatomic, retain) NSString *publicMemberWithProperty; @end C.为头文件中的公共成员声明纯属性(不声明相对ivars),并在实现文件的私有接口中为私有成员声明纯属性(不声明相对ivars)。 恕我直言,这个方法比第一个更清楚,但同样的问题仍然存在:为什么我们必须有内部/本地成员的财产? 这是一个示例: //==== header file […]