Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.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
Objective-C ARC和实例变量iOS SDK_Objective C_Ios - Fatal编程技术网

Objective-C ARC和实例变量iOS SDK

Objective-C ARC和实例变量iOS SDK,objective-c,ios,Objective C,Ios,我们应该将所有希望保留的实例变量都转换为私有属性,还是我遗漏了一些明显的东西 @interface SomethingElse : Something { NSMutableArray *someArray; } 在本例中,使用[NSMutableArray initWithObject:someObject]在方法中初始化someArray,但不保留 我的特殊情况是,我正在更新一个游戏,有很多实例变量,所以我想确保为了sdk的未来版本,我做得正确。ARC的retain版本称为s

我们应该将所有希望保留的实例变量都转换为私有属性,还是我遗漏了一些明显的东西

@interface SomethingElse : Something  {

    NSMutableArray *someArray;

}
在本例中,使用[NSMutableArray initWithObject:someObject]在方法中初始化someArray,但不保留


我的特殊情况是,我正在更新一个游戏,有很多实例变量,所以我想确保为了sdk的未来版本,我做得正确。

ARC的
retain
版本称为
strong

基本上,您可以使用以下方式声明它:

@property (strong) NSMutableArray *someArray;
有关详细信息,请参阅


通常最好使用属性而不是局部变量,因为属性“免费”提供访问器/设置器,并且通常更易于使用。

对于Obj-C 2.0及更高版本,似乎没有什么理由使用IVAR。我个人已经很久没有用过了。酒店为您提供一切服务

我们应该转换所有我们希望转换的局部变量吗 保留私人财产还是我遗漏了一些明显的东西

@interface SomethingElse : Something  {

    NSMutableArray *someArray;

}
首先,您在示例中显示的变量是实例变量,而不是局部变量。局部变量在代码块内声明(例如,在函数或方法内,或在某些子块(如条件语句体)内),其生存期仅限于声明它们的块的执行。实例变量在类中声明;该类的每个实例都获得该类声明的实例变量的副本


其次,不需要将所有实例变量转换为属性。属性实际上只是一个承诺,即类提供具有特定语义的特定访问器。拥有一个实例变量并不意味着您必须为该ivar提供访问器。(有些人可能会说您应该,但您不必这样做。)

一个@property与一个实例变量相同,除非您使用的不是默认的存储修饰符,它对对象很强。例如,如果您想要
@property(copy)NSString*s使用实例变量并记住每次设置变量时调用copy,或者使用@property(更简单)。

您在其他一些注释中描述了一个错误的访问问题。这里还有别的事情。在ARC中,除非另有规定,否则您的IVAR是强大的(在非ARC中,它们不会代表您发布)

例如,此ARC代码工作正常,当您在对其他答案的评论中报告时,不会出现错误访问:

@interface ArcTestViewController ()
{
    NSMutableArray *_someArray;
}
@end

@implementation ArcTestViewController

- (void)dealloc
{
    _someArray = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _someArray = [[NSMutableArray alloc] initWithObjects:@"Mo", @"Larry", @"Curly", nil];
}

- (IBAction)checkIvarTouchUpInside:(id)sender 
{
    NSLog(@"%s _someArray = %@", __FUNCTION__, _someArray);
}

@end
您可能必须向我们展示您的示例,您在哪里获得了糟糕的访问权限,因为它必须是其他的

在回答“property”或“ivar”问题时,虽然我赞同“always use properties”的论点,但就我个人而言,我对任何需要提供外部访问器的东西都使用属性,否则我使用私有ivar(不是在.h中,而是在.m文件的私有接口中)。这使得我的.h文件中的公共接口在几个月后返回时非常干净,易于理解。如果您采用“始终使用属性”的方法,我只建议您对这些属性的公开声明应尽可能严格(如果可以,将属性设置为私有;如果不需要提供读写访问,将属性的公开声明设置为只读,等等)


顺便说一句,Cocoa编码指南是最佳实践的良好参考。

谢谢大家的回复

如果我调用需要对象的方法(使用cocos2d游戏引擎方法):

如果我直接调用该对象而不将其放入cocos2d调度程序,则该对象将被取消引用:

[self someMethod];
然后仍然有一个有效指针。只是为了测试,我保留了它,它一直保留着

所以现在的问题是,我们如何强制一个retain来防止ARC认为我们已经完成并释放了它


将实例变量更改为私有属性是安全的,因此我们将以此作为答案。

谢谢,我理解ARC如何处理属性,但我的问题是确定现在是否应该用私有属性替换局部变量(如果我们想保留它们)?苹果建议您不再显式声明变量,除非您需要。使用属性,如果需要直接访问iVar,可以在合成属性时设置iVar名称,例如:@synthesis myProperty=__myVariable@BillKervaski这和ARC没什么区别。这个答案没有指出ARC中的属性和IVAR之间的差别很小,因为所有的内存管理都是为您完成的,所以您可以使用其中一种。@RichardJ.RossIII:不正确。属性的主要优点是,只要在声明属性时提供各种属性,就可以神奇地生成访问器/设置器。这不仅仅是内存管理。使用属性,您可以轻松地将其设置为只读、设置原子性、每次设置新值时将其复制等。此外,对于OP想要的内容,@属性更好,因为您可以轻松地将其设置为
strong
。使用IVAR有很多原因。榜首:对于黑客来说,在运行时使用动态库并弄乱代码要困难得多,允许使用更简单的C样式数组,并且比属性更轻。@RichardJ.RossIII:关于iVars安全性:它是否适用于iOS沙盒环境?@user523234是的。任何拥有越狱设备的人都可以在您不希望发生的可执行文件上执行代码,而当使用IVAR而不是属性时,该代码更难执行。@RichardJ.RossIII对于黑客来说,他们是否能够访问我的实现中声明的属性(即非公共属性)?@bgoers是的,他们可以。他们可以对变量做完全相同的操作,只是有点难