Исключение NSInvalidArgumentException при программировании iphone

#iphone #objective-c #xcode

#iPhone #objective-c #xcode

Вопрос:

Я все еще новичок в objective-c программировании, я получил это исключение, но я не знаю, что это значит, исключение здесь, а после него есть код..

 Running2011-11-02 12:10:31.923 app3[1322:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***  [Person<0x100001098> init]: cannot init a class object.'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00007fff8499c7b4 __exceptionPreprocess   180
    1   libobjc.A.dylib                     0x00007fff84729f03 objc_exception_throw   45
    2   CoreFoundation                      0x00007fff849f5f29  [NSObject(NSObject) init]   137
    3   app3                                0x0000000100000d99 main   124
    4   app3                                0x0000000100000c60 start   52
    5   ???                                 0x0000000000000001 0x0   1
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
sharedlibrary apply-load-rules all
  

и вот код, который вызывает это исключение, этот код является только create class(interface) и создает экземпляр этого класса и устанавливает значения ..

 #import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
@interface Person:NSObject{

    int age;
    int weight;
}

-(void) print;
-(void) setAge:(int) a;
-(void) setWeight:(int) w;

@end


@implementation Person
-(void) print{
    NSLog(@"I am %i years old and weight %i pound",age,weight);
}
-(void) setAge:(int) a{
    age = a;
}
-(void) setWeight:(int)w{
    weight = w;
}
@end

int main(int argc, char *argv[]){
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
    Person *adham;
    adham = [Person alloc];
    adham = [Person init];
    [adham setAge:24];
    [adham setWeight:68];
    [adham print];
    [pool release];
    [pool retain];
    return 0;

}
  

Ответ №1:

Это неправильно:

 adham = [Person alloc];
adham = [Person init];
  

alloc — это метод класса, init — это метод экземпляра, вы должны это делать

 adham = [[Person alloc] init];
  

Кроме того, посмотрите на ваши две строки в конце

 [pool release];
[pool retain];
  

почему вы сохраняете NSAutoreleasePool? вы не должны быть (на самом деле вы должны получить сбой). Освободите пул и вернитесь.

Ответ №2:

Это должно быть разделено следующим образом,

 Person *adham;
adham = [Person alloc]; // alloc is a class method
adham = [adham init]; // init is an instance method