How*_*Gee 39 arrays objective-c nsarray ios
我是Objective-C和iOS的新手,所以我一直在玩Picker View.我已经定义了一个Person Class,这样当你创建一个新的Person时,它会自动给那个人一个名字和年龄.
#import "Person.h"
@implementation Person
@synthesize personName, age;
-(id)init
{
self = [super init];
if(self)
{
personName = [self randomName];
age = [self randomAge];
}
return self;
}
-(NSString *) randomName
{
NSString* name;
NSArray* nameArr = [NSArray arrayWithObjects: @"Jill Valentine", @"Peter Griffin", @"Meg Griffin", @"Jack Lolwut",
@"Mike Roflcoptor", @"Cindy Woods", @"Jessica Windmill", @"Alexander The Great",
@"Sarah Peterson", @"Scott Scottland", @"Geoff Fanta", @"Amanda Pope", @"Michael Meyers",
@"Richard Biggus", @"Montey Python", @"Mike Wut", @"Fake Person", @"Chair",
nil];
NSUInteger randomIndex = arc4random() % [nameArr count];
name = [nameArr objectAtIndex: randomIndex];
return name;
}
-(NSInteger *) randomAge
{
//lowerBound + arc4random() % (upperBound - lowerBound);
NSInteger* num = (NSInteger*)(1 + arc4random() % (99 - 1));
return num;
}
@end
Run Code Online (Sandbox Code Playgroud)
现在我想制作一个人数组,这样我就可以把一大堆扔进选择器,挑选一个人并显示他们的年龄.首先,虽然我需要制作一个人数组.如何创建对象数组,初始化和分配它们?
All*_*eng 70
还有一个简写这样做:
NSArray *persons = @[person1, person2, person3];
Run Code Online (Sandbox Code Playgroud)
它相当于
NSArray *persons = [NSArray arrayWithObjects:person1, person2, person3, nil];
Run Code Online (Sandbox Code Playgroud)
正如iiFreeman所说,如果你不使用ARC,你仍需要进行适当的内存管理.
iiF*_*man 41
NSMutableArray *persons = [NSMutableArray array];
for (int i = 0; i < myPersonsCount; i++) {
[persons addObject:[[Person alloc] init]];
}
NSArray *arrayOfPersons = [NSArray arrayWithArray:persons]; // if you want immutable array
Run Code Online (Sandbox Code Playgroud)
你也可以在不使用NSMutableArray的情况下达到这个目的:
NSArray *persons = [NSArray array];
for (int i = 0; i < myPersonsCount; i++) {
persons = [persons arrayByAddingObject:[[Person alloc] init]];
}
Run Code Online (Sandbox Code Playgroud)
还有一件事 - 它对于启用ARC的环境有效,如果你打算在没有ARC的情况下使用它,不要忘记将自动释放的对象添加到数组中!
[persons addObject:[[[Person alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)
没有人评论这种randomAge方法?
这是非常错误的,它可能不是任何wronger.
NSInteger是一种原始类型 - 它很可能是typedef'd int或long.在该randomAge方法中,您计算从1到98的数字.
然后你可以将该数字转换为NSNumber.你必须添加一个演员,因为编译器给你一个你不明白的警告.这让警告消失了,但是给你留下了一个可怕的错误:这个数字被强制成一个指针,所以现在你有一个指向前100个字节内存中某个整数的指针.
如果NSInteger通过指针访问,程序将崩溃.如果你通过指针写,你的程序将崩溃.如果将它放入数组或字典中,程序将崩溃.
将其更改为NSInteger或int,这可能是最好的,或者NSNumber如果您出于某种原因需要对象.然后通过调用[NSNumber numberWithInteger:99]或您想要的任何数字来创建对象.
| 归档时间: |
|
| 查看次数: |
149173 次 |
| 最近记录: |