Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在自定义init方法中不调用[super init]可以吗?_Ios_Objective C_Cocoa Touch_Nscoding - Fatal编程技术网

Ios 在自定义init方法中不调用[super init]可以吗?

Ios 在自定义init方法中不调用[super init]可以吗?,ios,objective-c,cocoa-touch,nscoding,Ios,Objective C,Cocoa Touch,Nscoding,我有一个MKPolyline subblass,我想实现NSCoding,即 不调用[super init]是肮脏的,这与我的良好编程理念不符。如果你自己不叫super,它就不是真正的子类;这只是一个巴斯德式的组合,依赖于调用方便构造函数的副作用。说到这里,我相信您描述的方法可以正常工作,但它违背了良好的Objective-C编程及其惯例 我的建议是使用MKPolyLine作为MKPolyLine实例,并使用一个类别来添加所需的额外提示。至于添加额外的实例变量等等,您可以使用关联的对象。对这个概

我有一个MKPolyline subblass,我想实现NSCoding,即

不调用[super init]是肮脏的,这与我的良好编程理念不符。如果你自己不叫super,它就不是真正的子类;这只是一个巴斯德式的组合,依赖于调用方便构造函数的副作用。说到这里,我相信您描述的方法可以正常工作,但它违背了良好的Objective-C编程及其惯例

我的建议是使用MKPolyLine作为MKPolyLine实例,并使用一个类别来添加所需的额外提示。至于添加额外的实例变量等等,您可以使用关联的对象。对这个概念的介绍可以是,所以这个问题解决了它们在类别中的使用:

不调用[super init]是肮脏的,这与我的好编程理念不符。如果你自己不叫super,它就不是真正的子类;这只是一个巴斯德式的组合,依赖于调用方便构造函数的副作用。说到这里,我相信您描述的方法可以正常工作,但它违背了良好的Objective-C编程及其惯例


我的建议是使用MKPolyLine作为MKPolyLine实例,并使用一个类别来添加所需的额外提示。至于添加额外的实例变量等等,您可以使用关联的对象。对这个概念的介绍可以是,所以这个问题解决了它们在类别中的使用:

虽然通常允许在init方法中创建和返回不同的对象,但该行存在以下三个问题。与此相反,我建议重写points和pointCount属性,以便可以返回存储在实例变量中的值,并在实例变量为空时调用超级实现。然后,您的初始值设定项只是设置这些实例变量,以便使用它们

- (MKMapPoint *)points {
    if(myPointsIvar == NULL) return [super points];
    else return myPointsIvar;
}
// similarly for pointCount
第一个问题是您正在创建一个新对象,但没有释放旧对象,这意味着您正在泄漏它。您应该将结果存储在不同的变量中,然后释放self,然后返回不需要存储在self中的结果

其次,polylineWithPoints:count:返回一个自动删除的对象,但是initWithCoder:应该返回一个保留的对象。除非有另一个保留,否则它可以在您仍在使用它时解除分配

如果这是唯一的问题,您可以这样解决这两个问题:

MKPolyline *result = [MKPolyline polylineWithPoints:points count:pointCount];
[self release];
return [result retain];

然而,还有第三个问题不能这么容易解决。polylineWithPoints:count:不返回RSRoutePolyline对象,它返回的对象可能与子类的方法不兼容,例如,它可能不支持NSCoding。实际上没有办法解决这个问题,所以不能使用polylineWithPoints:count:。

虽然通常允许在init方法中创建和返回不同的对象,但该行存在以下三个问题。与此相反,我建议重写points和pointCount属性,以便可以返回存储在实例变量中的值,并在实例变量为空时调用超级实现。然后,您的初始值设定项只是设置这些实例变量,以便使用它们

- (MKMapPoint *)points {
    if(myPointsIvar == NULL) return [super points];
    else return myPointsIvar;
}
// similarly for pointCount
第一个问题是您正在创建一个新对象,但没有释放旧对象,这意味着您正在泄漏它。您应该将结果存储在不同的变量中,然后释放self,然后返回不需要存储在self中的结果

其次,polylineWithPoints:count:返回一个自动删除的对象,但是initWithCoder:应该返回一个保留的对象。除非有另一个保留,否则它可以在您仍在使用它时解除分配

如果这是唯一的问题,您可以这样解决这两个问题:

MKPolyline *result = [MKPolyline polylineWithPoints:points count:pointCount];
[self release];
return [result retain];

然而,还有第三个问题不能这么容易解决。polylineWithPoints:count:不返回RSRoutePolyline对象,它返回的对象可能与子类的方法不兼容,例如,它可能不支持NSCoding。确实没有办法解决这个问题,所以不能使用polylineWithPoints:count:。

您应该对NSObject的任何子类调用init方法。因为MKPolyline是一个NSObject,所以应该初始化它

但是MKPolyline没有方法,也没有init。这就是C的目标,它告诉你不能对它进行子类化

相反,正如WDUK所建议的,定义您自己的类。它跟踪列表点,并管理NSCoding以根据需要保存和恢复它们

 @interface RSPolyline: NSObject<NSCoding>

 - (id) initWithPoints: (NSArray*) points;
 - (id) initWithCoder:(NSCoder *)aDecoder;
 - (void) encodeWithCoder:(NSCoder *)aCoder;

 - (MKPolyline*) polyLine;

 @end
您的类可以根据请求生成多段线,如果性能有问题,可能会缓存结果


一般来说,不要先去继承遗产。当您想要扩展和改进一个类时,首先考虑组合

应该对NSObject的任何子类调用init方法。自从M KPolyline是一个NSObject,您应该初始化它

但是MKPolyline没有方法,也没有init。这就是C的目标,它告诉你不能对它进行子类化

相反,正如WDUK所建议的,定义您自己的类。它跟踪列表点,并管理NSCoding以根据需要保存和恢复它们

 @interface RSPolyline: NSObject<NSCoding>

 - (id) initWithPoints: (NSArray*) points;
 - (id) initWithCoder:(NSCoder *)aDecoder;
 - (void) encodeWithCoder:(NSCoder *)aCoder;

 - (MKPolyline*) polyLine;

 @end
您的类可以根据请求生成多段线,如果性能有问题,可能会缓存结果


一般来说,不要先去继承遗产。当您想要扩展和改进一个类时,首先考虑组合

你的记忆走错了方向。目的地在前面。您可以使用[pointData bytes]而不是分配和复制数据。@ughoavgfhw谢谢,我已经编辑了我的答案。。是行:MKMapPoint*points=MKMapPoint*[pointData bytes];你需要什么?需要桥吗?我被c桥弄糊涂了。不,我相信一个普通的桥就足够了。我解决了这个问题,我有3个很好的答案。。。组合、类别和覆盖属性-我不知道现在该怎么办:你的记忆走错了方向。目的地在前面。您可以使用[pointData bytes]而不是分配和复制数据。@ughoavgfhw谢谢,我已经编辑了我的答案。。是行:MKMapPoint*points=MKMapPoint*[pointData bytes];你需要什么?需要桥吗?我被c桥弄糊涂了。不,我相信一个普通的桥就足够了。我解决了这个问题,我有3个很好的答案。。。组合、类别和覆盖属性-我不知道现在该怎么办:好的方面,但是使用子类对我来说很有用,因为我的mapView上有多种类型的MKPolyLine,所以我可以使用[overlay有点像类…在viewForOverlay中:一定要区分它们。在这种情况下,您是否可以使用容器对象,或者遵循特定的协议来实现您所需要的,而不是子类化MKPolyLine?我不确定使用它的上下文。仅仅因为继承很方便,并不意味着它是正确的做法。好的方面是,使用子类对我很有用,因为我的mapView上有多种类型的MKPolyLine,所以我可以使用[overlay有点像类…在viewForOverlay中:一定要区分它们。在这种情况下,您是否可以使用容器对象,或者遵循特定的协议来实现您所需要的,而不是子类化MKPolyLine?我不确定使用它的上下文。仅仅因为继承很方便,并不意味着它是正确的做法。值得一提的是,[RSPolyline Polyline WithPoints:…]实际上返回了子类的一个实例。但我不确定我是否会依赖它,因为方法签名没有通过返回类型id来表示这一点。值得一提的是,[RSPolyline Polyline WithPoints:…]实际上返回子类的一个实例。但我不确定我是否会依赖它,因为方法签名没有通过返回类型id表示这一点。BOOM-我选择了这个答案。我认为这是最优雅的。谢谢!BOOM-我选择了这个答案。我认为这是最优雅的。谢谢!