我发现这个用objective-c编写的哈希表的实现。我几乎可以遵循所有这些,但我很难理解 - (id)init函数究竟是如何工作的。这是HashTable.m文件中有3行的方法(我在问题后面重新编写了它)。有人可以解释它到底在做什么吗?我包括了一些其他相关的代码,虽然在大多数情况下我认为我可以遵循其余的。尽管我不清楚init方法的细节。感谢
-(id)init
{
self =[super init];
self.othercontainer = [[NSMutableArray alloc]init];
return self;
HashTable.h
#import <Foundation/Foundation.h>
@interface HashTable : NSObject
@property(nonatomic) NSMutableArray* othercontainer;
-(id)objectForKey:(NSString*)name;
-(void)setObject:(id)object forKey:(NSString*)name;
-(id)init;
@end
HashTable.m
#import "HashTable.h"
#import "Person.h"
@implementation HashTable
-(id)init
{
self =[super init];
self.othercontainer = [[NSMutableArray alloc]init];
return self;
}
-(id)objectForKey:(NSString*)name
{
Person* tempPerson = nil;
for (id item in self.othercontainer)
{
NSString* tempName = [((Person*)item) name];
if ([tempName isEqualToString:name])
{
tempPerson = item;
break;
}
}
return tempPerson;
}
-(void)setObject:(id)object forKey:(NSString*)name
{
[self.othercontainer addObject:object];
}
@end
ViewController.m的一部分
NSData *data;
NSFileHandle *fh;
NSString *inBoundFile = @"/Users/user/Desktop/names.txt";
NSString *fileString;
fh = [NSFileHandle fileHandleForReadingAtPath:inBoundFile];
data = [fh readDataToEndOfFile];
fileString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSArray *PersonArray = [fileString componentsSeparatedByString:@"\n"];
self.container = [[HashTable alloc]init];
for (int x= 0; PersonArray.count > x ;x++) {
NSArray* tempNameandAddress = [PersonArray[x] componentsSeparatedByString:@" "];
Person *personA = [[Person alloc]init]; //could be other ways of defining an instance of an object
personA.name = tempNameandAddress[0];
personA.address = tempNameandAddress[1];
if ([self.container objectForKey:personA.name] == nil)
[self.container setObject:personA forKey:personA.name];
else
NSLog(@"%@ already exists \n",personA.name);
}
答案 0 :(得分:2)
这只是一个几乎正确的公共init。
self设置为超类init返回的对象。
然后他们错过了一个合适的步骤
下一步应该是if (self) { ...additional setup... }
基本上只有创建ivars /属性,如果从super init返回的self不是nil。
如果self在那时是零,你通常会绕过额外的代码并直接返回self。 (返回无)
下一行是为othercontainer属性创建NSMutableArray ivar。
这也不太对。
在init中,这是您应该直接使用合成的ivar。
_othercontainer = [[NSMutableArray alloc] init];
这里没什么特别的。