我在iOs 5中使用故事板创建了一个应用程序在该应用程序中,我需要为表视图使用一个NSMutableArray。所以我创建了如下所示的数组。但在ios4中,我们创建了像
这样的数组@interface MySpots : UITableViewController{
NSMutableArray *MySpots;
}
@property (nonatomic, strong) NSMutableArray *MySpots;
和.m文件
@synthesize MySpots;
- (void)viewDidLoad
{
[super viewDidLoad];
MySpots = [[NSMutableArray alloc]init];
for (int i = 0; i<10; i++) {
mySpot.SpotName = @"Name Of Spot";
mySpot.SpotTime = @"15mi";
mySpot.SpotDis = @"Short preview of the description will appear in this section.Acts as a reminder for relevant";
[MySpots addObject:mySpot];
}
}
但是当我尝试在iOs 5中这样做时,它会在
上显示错误("Expected identifier or {")MySpots = [[NSMutableArray alloc]init];
因为在ios5中不需要发布。我应该如何在ios5中声明NSMutableArray。提前感谢:)
这与iOS 5无关,而是来自objective c的编译器错误。基本问题是您使用MySpots
作为接口名称和属性/实例变量。当遇到你的行
MySpots = [[NSMutableArray alloc]init];
编译器现在不确定这是变量MySpots
还是应该是类型为MySpots
的变量声明,例如
MySpots *mySecondController = ...;
编译器假定是第二个变量,因为缺少变量名而退出。
你应该
- 将该属性的名称更改为与类名称不同的名称,以避免混淆
- 使用
self.property =
而不是property =
,因为这使用正确的内存管理。ARC在某种程度上减少了这个问题,但使用属性提供的自动保留/释放是一个很好的实践。
其中任何一个都有帮助(在情况1中编译器现在清楚该怎么做,在情况2中self.MySpots
将是一个唯一的名称,不能与类名混淆),但我肯定会两者兼得,重命名属性(或类)并使用self.property =
。
PS:即使使用ARC,您仍然可以通过使用[[NSMutableArray alloc] init]
初始化,ARC只是在幕后插入适当的retain
和releases
。
这段代码永远不可能被编译,更不用说正常工作了!
首先:你在循环中使用的局部变量mySpot
首先来自哪里?
MySpots
既是一个类又是同一个类的ivar ?如果该声明在某些奇怪的编译器上有效,我会认为这是编译器中的错误。甚至如果这个声明被编译了——这已经有很多if了——你使用变量的那行不能工作,因为编译器不知道你指的是MySpots
类型还是实例变量——到目前为止编译的奇怪的东西可能在这里做了一些事情,但我不会相信这样一个"编译器"的代码输出的有效性。
这就是错误信息的来源